2011-05-03 3 views
18

Text 인코딩과 관련하여 거의 작업을 수행하지 않았습니다. 사실, 나는 그것이 무엇을 의미하는지 정확히 알지 못한다.텍스트 인코딩 이해 (Net)

예를 들어

, 내가 좋아하는 뭔가가있는 경우 :

Dim myStr as String = "Hello" 

특정 형식으로 메모리에 '인코딩'인가요? 그 형식은 내가 사용하는 언어에 달려 있습니까?

예를 들어 내가 중국과 같은 다른 나라에 있었다면 나는 중국어 문자열 (북경어? 여기에 잘못된 단어를 사용하는 경우 사과)을 사용하면 다음 코드를 사용할 수 있습니다. 영어 문자열에서) 여전히 동일하게 작동합니까?

System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(); 
return encoding.GetBytes(str); 

변환 할 때 유효하지 않은 .Net 문자열을 UTF8Encoding으로 변환하면 모든 의미가 손실됩니다.

마지막으로 저는 .Net을 몇 년 동안 사용해 왔으며 Encoding을 본 적이 없거나 들었거나 전혀하지 않아도되었습니다. 예외입니까 아니면 공통점이 있습니까?

+3

좋은 질문 ... 내 경험에 비추어 볼 때 많은 개발자들이 어려움을 겪고 있습니다. – jeroenh

답변

25

.NET 문자열 클래스는 UTF16을 사용하여 문자열을 인코딩합니다. 이는 한 문자 당 2 바이트를 의미합니다 (단, 두 개의 문자를 조합하여 단일 4 바이트 문자를 형성 할 수 있음, 이른바 "서로 게이트 쌍"이라고 함). 한편, 특정 유니 코드 문자, 즉 통상의 ASCII 문자에 대해서는 단지 1 바이트이지만, 한자에 대해서는 3 바이트 일 수있는 가변 바이트를 사용할 것이다. 두 인코딩 모두 모든 유니 코드 문자를 나타낼 수 있으므로 항상 같은 매핑 (유니 코드)을 사용하여 서로 다른 이진 표현 (즉, 메모리 또는 디스크에 저장)이 가능합니다.

모든 유니 코드 문자가 UTF-16으로 예약 된 원본 2 바이트에 들어갈 수있는 것은 아니므로이 형식은 2 바이트 UTF-16 문자를 조합하여 4 바이트 문자를 나타낼 수도 있습니다. 이렇게 형성된 문자는 "서로 게이트"또는 서로 게이트 쌍을 지칭하며 한 문자를 나타내는 16 비트 유니 코드 인코딩 값 쌍입니다.

유니 코드 문자 당 바이트 수가 고정되어 있지 않으므로 UTF-8에는이 문제가 없습니다. UTF-8, UTF-16 및 BOM에 대한 일반적인 개요는 here 수 있습니다.

유니 코드 문자 인코딩하는 우수한 개요/소개 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

+0

해당 링크 (및 나머지 답변)를 보내 주셔서 감사합니다 –

+0

멋진 기사 !! ("절대 최소 ...") 나는 내가 잘 이해하고 여전히 뭔가를 배웠다 고 생각했다. 읽기! –

1

UTF 여러 가지 크기와 부호화의 특정 유형이다. 각 인코딩 유형은 메모리가 얼마나 많은지, 그리고 문자가 차지할 메모리의 표현입니다.

일반적으로 우리는 유니 코드와 Ascii를 사용합니다.

유니 코드는 문자 당 2 바이트입니다.
ASCII는 문자 당 1 바이트입니다.

아스키는 유니 코드로 표현 될 수 있습니다. 그러나 유니 코드는 인코딩되지 않고 ascii로 표현 될 수 없습니다.

UTF 인코딩은 특수 문자 '%'를 사용하여 다음이 인코딩 된 문자의 16 진수 값임을 알려줍니다.

% 20 예를 들어 실제로는 공백 인 문자 32입니다.브라우저에서 해당 URL을 배치

http://www.google.com?q=space%20character 

은 % (20)는 이제 공간 통지 문자열 및 Q = 실제로 "공백 문자"로 해석됩니다 디코드-8 UTF 것이다.

UTF-16은 2 바이트를 사용하며 이와 같이 표시됩니다. URI를 실제로 UTF-8을 사용하도록되어 같은

http://www.google.com?q=space%0020character 

이 예는 실제로 실패, 그러나이 예는 점을 보여줍니다.

유니 코드 문자는 각각 0 또는 32 값을 갖는 0020 또는 2 바이트입니다.

북경어는 유니 코드 문자의 일부 유형이며 UTF-16은 유니 코드를 인코딩하므로 Ascii에서 나타낼 수 있습니다. 여기

깊이

http://en.wikipedia.org/wiki/UTF-8

9

첫 번째와 foremeost에 좀 더 설명하는 위키 기사입니다 : 절망하지 않습니다, 당신은 혼자가 아닙니다. 문자 인코딩 및 텍스트 표현의 대우에 대한 인식은 일반적으로 불행히도 드문 일이지만 지금 당장 배우기 시작할 시간이 없습니다!

.NET을 포함한 최신 시스템에서 텍스트 문자열은 유니 코드 code points의 일부 인코딩으로 메모리에 표시됩니다. 이것들은 숫자 일뿐입니다. 문자 A의 코드 포인트는 65입니다. 코드 번호 (c)169입니다. 태국어 6의 코드 포인트는 3670입니다.

"인코딩"이라는 용어는 이러한 숫자가 메모리에 표시되는 방식을 나타냅니다. 한 시스템에서 다른 시스템으로 데이터를 전송할 때 텍스트 표현이 일관성을 유지할 수 있도록 사용되는 여러 가지 표준 인코딩이 있습니다.

간단한 인코딩 표준은 UCS-2이므로 코드 포인트는 raw로 16 비트 단어로 저장됩니다. 이는 코드 포인트 0000-FFFF만을 나타낼 수 있고 이러한 범위는 유니 코드 코드 포인트의 전체 범위를 커버하지 않기 때문에 제한됩니다.

UTF-16은 .NET String 클래스에 의해 내부적으로 사용되는 인코딩입니다. 대부분의 문자는 여기에 하나의 16 비트 단어로 들어 있지만, FFFF보다 큰 값은 서로 게이트 쌍을 사용하여 인코딩됩니다 (위키 참조). 이 코드화 체계 때문에 코드 포인트 D800-DFFF은 UTF-16에 의해 enocded 될 수 없습니다.

UTF-8은 아마도 현재 가장 많이 사용되는 인코딩으로 Wiki 기사에 설명되어 있습니다.