C# - "Use Unicode UTF-8 for worldwide language support" 설정을 한 경우, 한글 입력이 '\0' 문자로 처리
다음과 같이 간단하게 코딩한 후,
Console.Write("입력: ");
string txt = Console.ReadLine();
Console.WriteLine(txt);
입력을 한글로 주면 txt에는 한글 문자만큼의 '\0' 문자가 반환됩니다.
이것은 환경의 문제입니다. 제어판의 Region 창에서 다음과 같이 "
Beta: Use Unicode UTF-8 for worldwide language support" 옵션을 적용한 환경의 경우,
저렇게 .NET 환경의 Console.ReadLine()으로 한글을 읽는 경우 '\0' 문자로 반환됩니다. 실제로, 저 옵션을 설정하지 않은 영문/한글 윈도우의 경우에는 한글 입력이 잘됩니다.
이런 문제를 해결하려면 Console.InputEncoding을 다음과 같이 바꿔줘야 합니다.
Console.InputEncoding = System.Text.Encoding.Unicode;
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.Write("입력: ");
string txt = Console.ReadLine();
Console.WriteLine(txt);
이후에는 정상적으로 입력한 한글이 txt 변수에 보관되는 것을 확인할 수 있습니다.
참고로, "Beta: Use Unicode UTF-8 for worldwide language support" 옵션 설정이 된 환경에서는 Console.InputEncoding의 기본값이 (
CodePage가 65001에 해당하는) "System.Text.UTF8Encoding+UTF8EncodingSealed"입니다.
// Windows 11 + Beta: Use Unicode UTF-8 for worldwide language support
Console.WriteLine(Console.InputEncoding); // System.Text.UTF8Encoding+UTF8EncodingSealed
// Console.InputEncoding.EncodingName == Unicode (UTF-8)
// Console.InputEncoding.CodePage == 65001
// Console.InputEncoding.HeaderName == utf-8
// Console.InputEncoding.WindowsCodePage == 1200
Console.WriteLine(System.Text.Encoding.Default); // System.Text.UTF8Encoding+UTF8EncodingSealed
반면 일반적인 한글/영문 윈도우에서는 이렇게 나옵니다.
// 한글 Windows 11
Console.WriteLine(Console.InputEncoding); // System.Text.OSEncoding
// Console.InputEncoding.EncodingName == (Code Page - 949)
// Console.InputEncoding.CodePage == 949
Console.WriteLine(System.Text.Encoding.Default); // System.Text.UTF8Encoding+UTF8EncodingSealed
// 영문 Windows 11
Console.WriteLine(Console.InputEncoding); // System.Text.OSEncoding
// Console.InputEncoding.EncodingName == (Code Page - 437)
// Console.InputEncoding.CodePage == 437
Console.WriteLine(System.Text.Encoding.Default); // System.Text.UTF8Encoding+UTF8EncodingSealed
따라서, "Beta: Use Unicode UTF-8 for worldwide language support" 옵션이 설정된 환경을 고려한다면 다음과 같은 처리를 하는 것도 좋을 듯합니다. ^^
if (Console.InputEncoding.CodePage == 65001)
{
Console.InputEncoding = System.Text.Encoding.Unicode;
}
Console.Write("입력: ");
string txt = Console.ReadLine();
Console.WriteLine(txt);
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]