이 C# 코드를 반환 ...ASCIIEncoding.ASCII.GetBytes() 예기치 않은 값
string s = "\u00C0";
byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s);
Trace.WriteLine(BitConverter.ToString(bytes));
는 다음과 같은 출력을 생성?
이 C# 코드를 반환 ...ASCIIEncoding.ASCII.GetBytes() 예기치 않은 값
string s = "\u00C0";
byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s);
Trace.WriteLine(BitConverter.ToString(bytes));
는 다음과 같은 출력을 생성?
\u00c0
은 ASCII (0-127 범위)가 아니기 때문에. 결과적으로 물음표 - ?
(0x3F) 인 것처럼 인코딩됩니다. ASCIIEncoding에
참조 MSDN 기사 : ASCII가 U + 0000에서, ASCII 문자가 가장 낮은 128 유니 코드 문자로 제한되는 7 비트 인코딩 때문에
ASCIIEncoding는 Windows 코드 페이지 20127.에 해당 U + 007F. Encoding.ASCII 속성 또는 ASCIIEncoding 생성자에서 반환 한 기본 인코더를 사용하는 경우 인코딩 작업을 수행하기 전에 해당 범위를 벗어나는 문자 이 물음표 (?)로 바뀝니다.
첫 번째 단계 : 유니 코드 문자열을 문자열로 채운 다음 ASCII로 변환합니다 (단, 유니 코드). 그런 다음 유니 코드 변환기를 사용하여 다시 변환하려고합니다.
다음의 예는 내 반응은 더 명확하게하기 위해 모든 가능성을 수행
static void Main(string[] args)
{
string s = "\u00C0";
Console.WriteLine(s);
byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s);
Console.WriteLine(BitConverter.ToString(bytes));
Console.WriteLine(ASCIIEncoding.ASCII.GetString(bytes));
Console.WriteLine("Again");
bytes = Encoding.UTF8.GetBytes(s);
Console.WriteLine(BitConverter.ToString(bytes));
Console.WriteLine(Encoding.UTF8.GetString(bytes));
Console.ReadLine();
}
을 그리고 출력은 다음과 같습니다
는A
3F
?
Again
C3-80
A
Btw는 BitConverter.GetBytes의 정의는 다음과 같습니다
지정된 배열의 각 요소의 숫자 값을 바이트의 해당하는 hexa로 변환합니다. 십진수 문자열 표현.
'BitConverter.ToString (bytes)'는 바이트 배열을 공백으로 구분 된 16 진수 문자열로 변환하는 편리한 방법입니다. OP의 코드에서 바이트 배열의 값을 16 진수로 출력하는 편리한 방법으로 사용되었습니다. – Verax
유니 코드 문자 열을 나타내는 바이트 시퀀스가 필요합니다. 분명히 바이트는 인코딩에 따라 다릅니다. C0이 바이트 중 하나라고 기대하기 때문에, 옵션을 약간 좁 힙니다. \u00c0
가 완전히 BMP 문자를 나타 내기 때문에 여기에 물론 두 바이트 UTF16LE입니다 : 당신은 당신은 아마 Encoding.GetEncoding`를 찾고 있습니다 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky
을 읽어야
를 ("ISO-8859-1") .GetBytes (s) '. 이것은 [코드 포인트 값의 바이트 값을 제공하는 유일한 인코딩입니다] (http://stackoverflow.com/a/15938015/995876). – Esailija
왜 ASCIIEncoding이 필요합니까? UTF8Encoding의 문제점은 무엇입니까? –