2013-07-23 4 views
3

많은 양의 문자를 유니 코드 코드 포인트로 변환해야합니다. 이것은 더 많은 일반 문자 작동문자열을 코드 포인트로 변환

string sample = "b"; 
int utf32 = char.ConvertToUtf32(sample, 0); 
string codePoint = string.Format("{0:X}", utf32); 

을, 그러나 나는 실제 문자열이 개 문자 a (U-0061)'̌' (U-030C)을 포함입니다이 같은 문자가 :이 변환을 수행하려면 다음 코드를 사용하고 있었다. 함수 ConverToUtf32(string, int)은 실제로는 U-0103을 기대했던 첫 번째 문자 (또는 색인에 따라 다른 문자) 만 반환합니다. ConvertToUtf32(char, char)을 사용하면 더 높은 코드 포인트에서 문자가 필요하기 때문에 작동하지 않습니다.

문자열을 코드 포인트로 변환하는 데 사용할 수있는 다른 함수가 있습니까, 아니면 수행 할 수있는 계산입니까?

답변

7

많은 양의 문자를 유니 코드 코드 포인트로 변환해야합니다.

실제로 당신이 요구하는 것 같지 않습니다. Basic Multilingual Plane (BMP)의 문자가있는 경우 각각 char은 정확히 하나의 코드 포인트에 해당합니다. UTF-32로 변환해도 아무런 변화가 없습니다.

ConvertToUtf32() 메서드, 특히 두 개의 char을 사용하는 오버로드는 BMP가 아닌 코드 포인트를 처리하기위한 것입니다. 그러나 그것은 당신이 필요로하는 것처럼 보이지 않습니다.

실제로 묻는 것 같습니다. normalize 문자열을 "정규화 양식 표준 구성 (NFC)"에 넣는 것입니다. ,

string decomposed = "\x0061\x030C"; 
string composed = decomposed.Normalize(NormalizationForm.FormC); 
foreach (char c in composed) 
    Console.WriteLine("U+{0:X4}", (int)c); 

이는 "U + 01CE"을 인쇄 할 것이다 당신이 원하는 것을 보인다있는 LATIN SMALL LETTER A WITH CARON있어 :이를 위해 the string.Normalize() method를 사용합니다. (U + 030C는 COMBINING CARON, 그래서 당신이 정말로 원하는 경우 결과는. CARON 함께 U + 01CE 라틴 소문자 A는 U + 0103 LATIN SMALL LETTER A WITH BREVE 대신 U + 0306 COMBINING BREVE을 사용해야합니다.)

+0

멋진 대답을, 그냥 뭐 내가 필요! 나는 정상화에 왔지만 그것이 필요하다는 것을 결코 깨닫지 못했다. –

+1

정규화 형식 C는 "결합 표시 없음"을 의미하지 않습니다. –

+0

감사합니다. 그 중 하나는 나중에 알게되었습니다. 내가 올바르게 이해한다면 정규화는 가능한 경우 [미리 조합 된 문자] (http://en.wikipedia.org/wiki/Precomposed_character)로 변환하는 것 같다. 그러나 아무도 없으면, 그것들을 분해 된 형태로 유지합니다. 나는 이것을 위해 수정 된 해결책을 찾아 내야 만했다. – user97462