2012-12-23 5 views
4

C#의 문자열 및 문자에 대한 질문이 하나 있습니다. C#의 문자열이 유니 코드 문자열이고 char가 2 바이트를 차지하는 것으로 나타났습니다. 따라서 모든 문자는 UTF-16 인코딩입니다. 멋지 네요. 그러나 Wikipedia에서도 UTF-16에서 4 바이트를 가져 오는 문자가 있다는 것을 읽었습니다.문자열과 4 바이트 유니 코드 문자

문자 숫자 식 표시를 위해 문자를 그릴 수있는 프로그램을 만들고 있습니다. 프로그램에는 테스터가있어 문자열을 쓸 수 있으며, 어떻게 보이는지 볼 수 있습니다.

그래서 사용자가 4 바이트, 즉 2자를 차지하는 문자를 쓰는 문자열로 어떻게해야합니까? 문자열을 통해 char을 통해 char을 가져와야하기 때문에 목록에서이 char을 찾아서 패널에 그려야합니다.

+2

charinging char는 단순히 작동하지 않습니다. 문자, 합자, 제어 문자 등이 결합되어 있으므로 코드 포인트로 코드 포인트를 지정해도 작동하지 않습니다. – CodesInChaos

+0

올바른 표시 표현 단위를 'grapheme 클러스터'라고합니다. 때로는 둘 이상의 코드 포인트가 있습니다. –

답변

4

당신은 당신이 할 수 있습니다 :

for(int i = 0; i < str.Length; ++i) { 
    int codePoint = Char.ConvertToUTF32(str, i); 
    if(codePoint > 0xffff) { 
     i++; 
    } 
} 

그런 다음 codePoint는 32 비트 정수로 가능한 모든 코드 포인트를 나타냅니다.

+0

이것은 어떻게 작동하는지 아주 간단하고 명확하게 보입니다. 감사합니다 하지만 이제는 4 바이트 UTF-16 문자를 찾으려고했는데 성공하지 못했습니다. 또는이 문자는 ''로 표시되므로 거의 무의미한 질문입니다. 하지만 감사합니다. – Arxeiss

0

전체적으로 String 개체로 작업하십시오. Char을 전혀 사용하지 마십시오. IndexOf를 사용하여 예 : String 클래스

var needle = "ℬ"; // U+1D49D (I think) 
var hayStack = "a code point outside basic multi lingual plane: ℬ"; 
var index = heyStack.IndexOf(needle); 

대부분의 방법은 Char 또는 String을 허용 과부하가있다. Char의 대부분의 메서드는 String을 사용하는 재정의를 가지고 있습니다. Char을 사용하지 마십시오.

+0

문자, 제어 문자 등을 결합하는 것에 대한 무지를 고백 할 것입니다. 정확하게 처리 할 수 ​​있을지 모르겠습니다. .NET의 유니 코드에 대해 읽고 몇 가지 테스트를 작성하십시오! – ligos