2013-04-12 5 views
2

이 C# 코드를 반환 ...ASCIIEncoding.ASCII.GetBytes() 예기치 않은 값

string s = "\u00C0"; 
byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s); 
Trace.WriteLine(BitConverter.ToString(bytes)); 

는 다음과 같은 출력을 생성?

+2

을 읽어야

string s = "\u00C0"; byte[] bytes = Encoding.Unicode.GetBytes(s); Trace.WriteLine(BitConverter.ToString(bytes)); 

를 ("ISO-8859-1") .GetBytes (s) '. 이것은 [코드 포인트 값의 바이트 값을 제공하는 유일한 인코딩입니다] (http://stackoverflow.com/a/15938015/995876). – Esailija

+0

왜 ASCIIEncoding이 필요합니까? UTF8Encoding의 문제점은 무엇입니까? –

답변

4

\u00c0은 ASCII (0-127 범위)가 아니기 때문에. 결과적으로 물음표 - ? (0x3F) 인 것처럼 인코딩됩니다. ASCIIEncoding

참조 MSDN 기사 : ASCII가 U + 0000에서, ASCII 문자가 가장 낮은 128 유니 코드 문자로 제한되는 7 비트 인코딩 때문에

ASCIIEncoding는 Windows 코드 페이지 20127.에 해당 U + 007F. Encoding.ASCII 속성 또는 ASCIIEncoding 생성자에서 반환 한 기본 인코더를 사용하는 경우 인코딩 작업을 수행하기 전에 해당 범위를 벗어나는 문자 이 물음표 (?)로 바뀝니다.

1

첫 번째 단계 : 유니 코드 문자열을 문자열로 채운 다음 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로 변환합니다. 십진수 문자열 표현.

+0

'BitConverter.ToString (bytes)'는 바이트 배열을 공백으로 구분 된 16 진수 문자열로 변환하는 편리한 방법입니다. OP의 코드에서 바이트 배열의 값을 16 진수로 출력하는 편리한 방법으로 사용되었습니다. – Verax

3

유니 코드 문자 열을 나타내는 바이트 시퀀스가 ​​필요합니다. 분명히 바이트는 인코딩에 따라 다릅니다. 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

관련 문제