2011-10-03 8 views
12

C++ 11은 새로운 문자열 리터럴 접두사 집합을 도입합니다 (사용자 정의 접미사도 허용). 이 외에도 유니 코드 이스케이프 시퀀스를 직접 사용하여 인코딩 걱정없이 특정 심볼을 코딩 할 수 있습니다.유니 코드 문자열 리터럴

const char16_t* s16 = u"\u00DA"; 
const char32_t* s32 = U"\u00DA"; 

는하지만 나뿐만 아니라 wchar_t 문자열 리터럴에 유니 코드 이스케이프 시퀀스를 사용할 수 있습니까? 이것이 가능하지 않다면 그것은 결함 인 것처럼 보일 것입니다.

const wchar_t* sw = L"\u00DA"; 

물론 특정 플랫폼에 무엇 wchar_t에 따라, 다른 모든 효과 것 sw[0]의 정수 값이 휴대용해야, 아니?

+0

난 SW '의 값이 [0]'wchar_t' 만의 범위에 특정 플랫폼 무엇 '에 따라 판단 'wchar_t'의 크기는 얼마입니까? 나는. '\ u00DA'는 U + 00DA의 유니 코드 인코딩 (UTF-8, UTF-16, UTF-32)을 항상 가져야합니다. – bames53

+1

실제로 위 내용이 잘못되었습니다. 구현은 범용 문자 이름을 리터럴 문자처럼 취급해야합니다. 따라서 구현시 문자열 리터럴의 문자를 실행 문자 집합으로 변환하면 UCN에서도 마찬가지입니다. UCN이 유니 코드 리터럴 (예 : u8 "\ u00DA") 안에있는 경우 UTF 인코딩 만 보장됩니다. – bames53

답변

8

그래도 작동하지만 원하는 의미론이 없을 수 있습니다. \u00DAwchar_t의 크기에 따라 UTF8/16/32 인코딩에 필요한만큼 많은 대상 문자로 확장되지만 넓은 문자열에는 문서화되고 보장 된 인코딩 의미가 없다는 점을 명심하십시오. 단순히 "시스템의 인코딩 "은 무엇인지 말하지 않고, 또는 사용자에게 을 알리려면을 알아야합니다.

그래서 혼합하지 않아야합니다. 둘 중 어느 하나가 아니라 둘 다 사용

  1. 시스템 별 : char*/"", wchar_t*/L"", \x -literals, mbstowcs/wcstombs

  2. 유니 코드 : char*/u8"", char16_t*/u"", char32_t*/U"", \u/\U 리터럴

(여기에서 주제 내 somerelatedquestions이다.)

+0

이 질문에 대한 자세한 내용은 [이 libC++ 테스트] (http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locale.categories/category.ctype/locale)를 참조하십시오. .ctype.byname/is_1.pass.cpp)가 Windows에서'\ x00DA' 라인에 실패했습니다. 나는 이것을'\ u00DA'로 대체 할 수 있을지와 그것이 충분히 큰 (즉 16 또는 32 비트) 모든'wchar_t'에 대해 작동하게 할 수 있을지 궁금하다. – rubenvb

관련 문제