2013-05-10 8 views
1

나는 계획하고있는 소프트웨어 시스템에 대한 문자 인코딩의 함의를 확인하려고 노력하고 있으며 테스트를하는 동안 이상한 것을 발견했습니다.C#에서 유니 코드 SMP "character"

내 지식으로 C#은 내부적으로 두 개의 16 비트 필드를 사용하는 모든 유니 코드 코드 포인트를 포함하는 UTF-16을 사용합니다. 그래서 저는 문자 리터럴을 만들고 의도적으로 선택하고 싶었습니다. 왜냐하면 전자가 SMP 평면에서 나온 것이고 후자가 BMP 평면에서 나온 것이기 때문입니다. 결과는 다음과 같습니다.

char ch1 = '얤'; // No problem 
char ch2 = ''; // Compilation error "Too many characters in character literal" 

무슨 일 이죠?

"얤얤"라는 문자열이 MessageBox에 올바르게 표시되어 있지만 ToCharArray를 사용하여 char []로 변환 할 때 세 개가 아닌 네 개의 요소가있는 배열이됩니다. 또한 String.Length는 3이 아닌 4로보고됩니다.

여기에 뭔가가 있습니까?

+0

아마도 복잡한 문자를 유니 코드 코드 포인트 (Unicode Code Point)로 저장하는 것이 일반적이며 길이는 2 문자입니다. –

+0

@ RaymondChen sharp eye ... 몇 가지 다른 검색을 시도했지만 관련성이 없다고 판명되었습니다! –

+0

어떻게 든이 질문을 복제본으로 닫을 수 있습니까? –

답변

0

소스 파일을 UTF-8 (소스에서 특수 문자를 사용할 때 권장 됨)에 저장하지 못할 수 있으므로 컴파일러에서 실제로 혼동을 일으키는 바이트 시퀀스를 볼 수 있습니다. 16 진수 편집기에서 소스 파일을 열면 문자 대신 표시되는 바이트가 다를 수 있음을 확인할 수 있습니다.

아직 켜져 있지 않은 경우 도구 -> 옵션 -> Visual Studio (2008 사용) 문서 - 해당 옵션은 Save documents as Unicode when data cannot be saved in codepage입니다.

일반적으로 문자 시퀀스를 사용하여 특수 문자를 지정하는 것이 좋습니다.

MSDN article\uxxxx 시퀀스를 사용하여 원하는 유니 코드 문자 코드를 지정하는 방법을 설명합니다. 이 blog entry에는 다양한 C# 이스케이프 시퀀스가 ​​나열되어 있습니다. \ xnnn을 사용하여 언급했기 때문에 포함하는 이유는이 형식을 사용하지 마십시오 : \u의 가변 길이 버전이며 일부 상황에서는 문제가 발생할 수 있습니다 ,).

MSDN article은 문자 할당이 좋지 않은 이유를 지적합니다. 문제의 문자에 대한 코드 포인트는 char 유형의 범위를 벗어난> FFFF입니다.

질문의 문자열 부분에 대한 대답은 SMP 문자가 두 개의 char 값으로 표현된다는 것입니다. This SO question에는 문자열에서 코드 포인트를 얻는 방법을 보여주는 코드가 일부 포함되어 있습니다. StringInfo.GetTextElementEnumerator를 사용합니다.

이 모든 내용은이 답변에 대한 설명에 포함되었으므로 여기에 관련 정보가 있습니다. 대답을하고 그것을 받아 들일 것입니다.

+0

대답은 실제로 MSDN 기사에서 인용 한 내용입니다. 코드 포인트는 1D6C03이고 기사에서는 10FFFF 이상의 코드 포인트가 지원되지 않는다고 명시되어 있습니다. 감사! –

+0

엄밀히 말하면 이전 주석이 잘못되었습니다. "U + 10000에서 U + 10FFFF 범위의 유니 코드 문자가 문자 리터럴에 허용되지 않고 문자열 리터럴에서 유니 코드 사로 게이트 쌍을 사용하여 표현됩니다." 문자열에서 10FFFF를 넘는 유니 코드 문자는 지원되지 않는다고 말합니다. 그냥 명확히 ... 코드 포인트가 FFFF 위에 있기 때문에 char 리터럴이 유효하지 않습니다. 코드 포인트가 10FFFF 이상이기 때문에 문자열 리터럴이 유효하지 않습니다. –

+0

이해할 수없는 것은> 10FFFF 코드 포인트가있는 문자열이 올바르게 표시되는 이유입니다 MessageBox에서 ... –