C ++ 0x의 새로운 유니 코드 문자
문제
UTF8, UTF16, UTF32 및 WCHAR_T (OS에 따라 UTF32 또는 UTF16 일 수 있음)를 포함한 다양한 인코딩에서 문자열을 가져올 수있는 API를 구입하고 있습니다.
새로운 C ++ 표준이 새로운 유형을 도입했습니다
char16_t
그리고char32_t
이는 이러한 모호한 규모가 없으며 향후 사용해야하므로 지원하고 싶습니다. 그러나 문제는입니다. 그들이 방해할까요? 정상으로uint16_t
,uint32_t
,wchar_t
동일한 유형을 참조 할 수 있으므로 과부하를 허용하지 않는 유형?class some_class { public: void set(std::string); // utf8 string void set(std::wstring); // wchar string utf16 or utf32 according // to sizeof(wchar_t) void set(std::basic_string<uint16_t>) // wchar independent utf16 string void set(std::basic_string<uint32_t>); // wchar independent utf32 string #ifdef HAVE_NEW_UNICODE_CHARRECTERS void set(std::basic_string<char16_t>) // new standard utf16 string void set(std::basic_string<char32_t>); // new standard utf32 string #endif };
그래서 나는 그냥 쓸 수 있습니다.
foo.set(U"Some utf32 String"); foo.set(u"Some utf16 string");
Typedef는 무엇입니까?
std::basic_string<char16_t>
그리고std::basic_string<char32_t>
오늘이있는 것처럼 :typedef basic_string<wchar_t> wstring.
참조를 찾을 수 없습니다.
편집 : GCC-4.4의 헤더에 따르면 이러한 새로운 유형을 소개했습니다.
typedef basic_string<char16_t> u16string; typedef basic_string<char32_t> u32string;
나는 이것이 GCC-Im이 아닌 실제 표준 요구 사항인지 확인하고 싶습니다.
해결책
1) char16_t
그리고 char32_t
뚜렷한 새로운 유형이 될 것이므로 과부하가 가능합니다.
인용 ISO/IEC JTC1 SC22 WG21 N2018:
정의하다
char16_t
이름이있는 독특한 새로운 유형에 대한 타이핑이 되려면_Char16_t
그것은 크기와 표현이 동일합니다uint_least16_t
. 마찬가지로 정의하십시오char32_t
이름이있는 독특한 새로운 유형에 대한 타이핑이 되려면_Char32_t
그것은 크기와 표현이 동일합니다uint_least32_t
.
추가 설명 (devx.com 기사에서 "유니 코드 혁명을 준비하십시오"):
왜 그런지 궁금 할 것입니다
_Char16_t
그리고_Char32_t
typedef가있을 때 처음에는 유형과 키워드가 필요합니다.uint_least16_t
그리고uint_least32_t
이미 사용할 수 있습니다. 새로운 유형이 해결하는 주요 문제는 과부하입니다. 이제 기능을 과부하 할 수 있습니다_Char16_t
그리고_Char32_t
인수, 다음과 같은 전문화를 만듭니다std::basic_string<_Char16_t>
그것은 구별됩니다std::basic_string <wchar_t>
.
2) u16string
그리고 u32string
실제로 C ++ 0X의 일부이며 GCC'ism만이 아닙니다. 다양한 표준 초안 용지. 그들은 새로 포함될 것입니다 <string>
헤더. 같은 기사에서 인용 :
표준 라이브러리도 제공합니다
_Char16_t
그리고_Char32_t
typedefs, typedefs와 유사합니다wstring
,wcout
, 다음 표준 클래스의 경우 등 :
filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,
string