Microsoft MVP성태의 닷넷 이야기
.NET Framework: 867. C# - Encoding.Default 값을 바꿀 수 있을까요? [링크 복사], [링크+제목 복사],
조회: 29259
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 2개 있습니다.)
(시리즈 글이 7개 있습니다.)
.NET Framework: 248. 닷넷에서 지원되는 문자열 인코딩 이름 목록
; https://www.sysnet.pe.kr/2/0/1147

.NET Framework: 368. Encoding 타입의 대체(fallback) 메카니즘
; https://www.sysnet.pe.kr/2/0/1446

.NET Framework: 373. C# 문자열의 인코딩이란?
; https://www.sysnet.pe.kr/2/0/1461

.NET Framework: 701. 한글이 포함된 바이트 배열을 나눈 경우 한글이 깨지지 않도록 다시 조합하는 방법
; https://www.sysnet.pe.kr/2/0/11378

.NET Framework: 702. 한글이 포함된 바이트 배열을 나눈 경우 한글이 깨지지 않도록 다시 조합하는 방법(두 번째 이야기)
; https://www.sysnet.pe.kr/2/0/11381

.NET Framework: 867. C# - Encoding.Default 값을 바꿀 수 있을까요?
; https://www.sysnet.pe.kr/2/0/12037

닷넷: 2190. C# - 닷넷 코어/5+에서 달라지는 System.Text.Encoding 지원
; https://www.sysnet.pe.kr/2/0/13506




C# - Encoding.Default 값을 바꿀 수 있을까요?

아래와 같은 질문이 있는데,

런타임 시 Encoding.Default를 UTF-8로 설정할 수 있을까요?
; https://www.sysnet.pe.kr/3/0/5240

일단 DB Provider의 내용은 차치하고, 순수하게 Encoding.Default를 변경할 수 있는지에 대해 알아보겠습니다.

이를 위해 Reflection으로 Encoding.Default의 내용을 보면,

public static Encoding Default
{
    [SecuritySafeCritical]
    get
    {
        if (defaultEncoding == null)
        {
            defaultEncoding = CreateDefaultEncoding();
        }
        return defaultEncoding;
    }
}

CreateDefaultEncoding이 호출되고 다시 그것을 보면,

[SecurityCritical]
private static Encoding CreateDefaultEncoding()
{
    int aCP = Win32Native.GetACP();
    switch (aCP)
    {
        case 1252:
            return new SBCSCodePageEncoding(aCP);
        case 65001:
            return s_defaultUtf8EncodingNoBom;
        default:
            return GetEncoding(aCP);
    }
}

결국 Win32 API인 GetACP에 의해 결정이 됩니다.

GetACP function
; https://learn.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-getacp

이 함수는 시스템의 기본 ACP(ANSI Code page) id 값을 반환하므로 조정할 수 있는 방법이 없습니다. 가령 SetACP라는 Win32 API는 없고 제어판에서 code page 변경 후 시스템을 재시작해야 하는데 이에 대해서는 전에 관련 글을 쓴 적이 있습니다.

영문 설정의 Windows 10 명령행 창(cmd.exe)의 한글 지원
; https://www.sysnet.pe.kr/2/0/11559




그래도, 편법이 하나 있긴 합니다. ^^ Encoding.Default는 defaultEncoding 정적 필드의 값을 반환하는 것이기 때문에,

namespace System.Text
{
    public abstract class Encoding : ICloneable
    {
        // ...[생략]...

        private static volatile Encoding defaultEncoding;

        // ...[생략]..
    }
}

다음과 같이 Reflection으로 바꿔주면,

private static void SetDefaultEncoding(Encoding encoding)
{
    Type type = typeof(System.Text.Encoding);
    FieldInfo field = type.GetField("defaultEncoding", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
    field.SetValue(null, encoding);
}

이렇게 사용할 수 있습니다.

static void Main(string[] args)
{
    SetDefaultEncoding(Encoding.ASCII);
    Console.WriteLine(Encoding.Default.EncodingName); // US-ASCII
            
    SetDefaultEncoding(Encoding.UTF8);
    Console.WriteLine(Encoding.Default.EncodingName); // Unicode (UTF-8)
}

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/7/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  [128]  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10814정성태6/22/201528290.NET Framework: 521. Roslyn을 이용해 C# 문법 변형하기 (2) [5]
10813정성태6/21/201528626.NET Framework: 520. Roslyn을 이용해 C# 문법 변형하기 (1)
10812정성태6/20/201529438.NET Framework: 519. C# 6.0 오픈 소스 컴파일러 Roslyn - 빌드 및 테스트 방법 [1]
10811정성태6/20/201526481오류 유형: 294. OpenAuth 사용 시 System.Data.SqlClient.SqlException 예외가 Output 창에 출력되는 문제
10810정성태6/18/201526424개발 환경 구성: 270. Visual Studio에서 github 오픈 소스를 fork해서 테스트하는 방법 [1]
10809정성태6/18/201524084.NET Framework: 518. AllowPartiallyTrustedCallers 특성이 적용된 GAC 어셈블리에서 DynamicMethod의 calli 명령어 사용파일 다운로드1
10808정성태6/17/201525670.NET Framework: 517. calli IL 호출이 DllImport 호출보다 빠를까요? [1]파일 다운로드1
10807정성태6/16/201527740.NET Framework: 516. Microsoft.AspNet.Membership.OpenAuth 사용 시 "Local Database Runtime error occurred" 오류
10806정성태6/16/201544294.NET Framework: 515. OpenAuth.VerifyAuthentication 호출 시 The remote server returned an error: (400) Bad Request
10805정성태6/15/201526700Java: 17. 자바의 재미있는 상수 처리 방식
10804정성태6/10/201527219.NET Framework: 514. .NET CLR2 보안 모델에서의 APTCA 역할 (2)파일 다운로드1
10803정성태6/2/201529401.NET Framework: 513. UWP(Universal Windows Platform) 응용 프로그램의 새로운 라이브러리 버전 관리 해법 [2]
10802정성태6/2/201527527개발 환경 구성: 269. 마이크로소프트 온라인 강좌 소개 - Azure VPN 구성 방법 [1]
10801정성태5/31/201533449.NET Framework: 512. async/await 사용 시 hang 문제가 발생하는 경우 - 두 번째 이야기 [3]
10800정성태5/29/201529289개발 환경 구성: 268. 소개 - 프로세싱(https://processing.org/)
10799정성태5/29/201526220사물인터넷: 3. 책 소개 - 라즈베리 파이로 구현하는 사물 인터넷 프로젝트 [1]
10798정성태5/26/201526653기타: 53. 2015년 6월 10일 밤 10시 온라인 세미나 - 새로운 Windows 10 App을 개발하는 방법
10797정성태5/23/201526216VC++: 91. 자식 스레드에 자동 상속되는 TEB의 SubProcessTag 필드파일 다운로드1
10796정성태5/23/201537230오류 유형: 293. SQL Server Management Studio 실행 시 "Cannot find one or more components" 오류
10795정성태5/23/201535806오류 유형: 292. InstallUtil로 .NET 서비스 등록 시 오류 - Operation is not supported. (Exception from HRESULT: 0x80131515). [3]
10794정성태5/22/201530330개발 환경 구성: 267. (무료) 마이크로소프트 온라인 강좌 소개 - 네트워킹 기초 [1]
2925정성태5/14/201529104디버깅 기술: 73. PDB 기호 파일의 경로 구성 방식파일 다운로드1
2924정성태5/14/201533261VS.NET IDE: 100. 비주얼 스튜디오 원격 디버깅 시 'Unknown function' 콜스택이 나온다면?
2923정성태5/12/201592986기타: 52. 도서: 시작하세요! C# 6.0 프로그래밍: 기본 문법부터 실전 예제까지 [17]
2922정성태5/12/201528145오류 유형: 291. ssindex.cmd 실행 시 '...[tfs_collection_url]...' not found in srcsrv.ini 오류 발생
2921정성태5/9/201535136개발 환경 구성: 266. 인텔에서 구현한 최대 절전 모드 기능 - Intel® Rapid Start Technology
... 121  122  123  124  125  126  127  [128]  129  130  131  132  133  134  135  ...