.Net 및 C #에서 모든 문자열은 UTF-16LE 로 인코딩됩니다 . A string
는 일련의 문자로 저장됩니다. 각각 char
은 2 바이트 또는 16 비트의 스토리지를 캡슐화합니다.
"종이 또는 화면에서"를 단일 문자, 문자, 글리프, 기호 또는 문장 부호로 보는 것은 단일 텍스트 요소로 생각할 수 있습니다. Unicode Standard Annex # 29 UNICODE TEXT SEGMENTATION에 설명 된대로 각 텍스트 요소는 하나 이상의 코드 포인트로 표시됩니다. 전체 코드 목록은 여기에서 찾을 수 있습니다 .
각 코드 포인트는 컴퓨터에 의한 내부 표현을 위해 바이너리로 인코딩되어야합니다. 명시된 바와 같이, 각각 char
은 2 바이트를 저장한다. 또는 그 이하의 코드 포인트 U+FFFF
는 단일로 저장할 수 있습니다 char
. 위의 코드 포인트 U+FFFF
는 두 개의 문자를 사용하여 단일 코드 포인트를 나타내는 서로 게이트 쌍으로 저장됩니다.
우리가 지금 추론 할 수있는 것을 알면, 텍스트 요소는 하나 char
의 문자, 두 문자의 대리 쌍으로 저장 되거나 텍스트 요소가 여러 코드 포인트로 표시되는 경우 단일 문자와 대리 쌍의 일부 조합 으로 저장 될 수 있습니다 . 그것이 충분히 복잡하지 않은 것처럼, 일부 텍스트 요소는 Unicode Standard Annex # 15, UNICODE NORMALIZATION FORMS에 설명 된 것처럼 코드 포인트의 다른 조합으로 표현 될 수 있습니다 .
막간
따라서 렌더링 할 때 똑같이 보이는 문자열은 실제로 다른 문자 조합으로 구성 될 수 있습니다. 이러한 두 문자열의 서수 (바이트 단위) 비교는 차이를 감지하므로 예상치 못한 또는 바람직하지 않을 수 있습니다.
.Net 문자열을 다시 인코딩 할 수 있습니다. 동일한 정규화 양식을 사용합니다. 정규화되면 같은 텍스트 요소를 가진 두 개의 문자열이 같은 방식으로 인코딩됩니다. 이렇게하려면 string.Normalize 함수를 사용하십시오 . 그러나 일부 다른 텍스트 요소는 서로 비슷하게 보입니다. :-에스
질문과 관련하여 이것이 무엇을 의미합니까? 텍스트 요소 '𠈓'
는 단일 코드 포인트 U + 20213 cjk 통합 표의 문자 확장명 b로 표시 됩니다. 즉, 단일 char
문자 로 인코딩 할 수 없으며 두 문자를 사용하여 서로 게이트 쌍으로 인코딩해야합니다. 이유는 string b
하나 char
이상 해당 string a
.
텍스트 요소 수를 안정적으로 계산해야하는 경우 (주의 사항 참조) 이 클래스를 string
사용해야합니다
System.Globalization.StringInfo
.
using System.Globalization;
string a = "abc";
string b = "A𠈓C";
Console.WriteLine("Length a = {0}", new StringInfo(a).LengthInTextElements);
Console.WriteLine("Length b = {0}", new StringInfo(b).LengthInTextElements);
출력을주고
"Length a = 3"
"Length b = 3"
예상대로.
경고
StringInfo
및 TextElementEnumerator
클래스 에서 유니 코드 텍스트 세그먼트의 .Net 구현은 일반적으로 유용해야하며 대부분의 경우 호출자가 기대하는 응답을 생성합니다. 그러나 유니 코드 표준 부록 # 29에 명시된 바와 같이 , "텍스트에만 항상 경계를 명확하게 결정할 수있는 충분한 정보가 포함되어 있지 않기 때문에 사용자 인식 일치 목표는 항상 정확하게 충족 될 수 없습니다."