2009-05-16 8 views
25

utf8, utf16, utf32 및 wchar_t (OS에 따라 utf32 또는 utf16 임) 등의 다양한 인코딩으로 문자열을 가져올 수있는 API를 작성하고 있습니다.C++의 새로운 유니 코드 문자 0x

  1. 새로운 C++ 표준이는 sizeof 모호성이없는 미래에 사용되어야한다, 그래서뿐만 아니라 그들을 지원하고자하는 새로운 유형의 char16_tchar32_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"); 
    
  2. std::basic_string<char16_t>의 타입 정의는 무엇

    std::basic_string<char32_t> 오늘이 같이

    typedef basic_string<wchar_t> wstring. 
    

    내가 어떤 참조를 찾을 수 없습니다.

    편집 : 난 그냥이 실제 표준 요구 사항이 있는지 확인하고 gcc를-주의하지 할

    typedef basic_string<char16_t> u16string; 
    typedef basic_string<char32_t> u32string; 
    

    : 이러한 새로운 유형의 도입 GCC-4.4의 헤더에 따라.

+0

의도하지 않은 내 사소한 방해/방해/간섭/맞춤법 corr 유혹. – ephemient

+0

고맙습니다. 수정본을 다시 병합합니다. – Artyom

답변

30

1) 및 char16_tchar32_t는 구별 할 정도로 새로운 유형 가능할 것이다 그들 과부하 것이다. ISO/IEC JTC1 SC22 WG21 N2018에서

인용구 :

uint_least16_t 이름과 동일한 크기를 가지고 표현 _Char16_t 더불어 구별 새로운 타입 타입 정의로 정의 char16_t. 마찬가지로 이름 uint_least32_t 같은 크기 및 표현을 갖는다 _Char32_t와 별개의 새로운 유형에 타입 정의로 정의 char32_t.

(A devx.com 문서 " Prepare Yourself for the Unicode Revolution"에서)

또한 설명 :

_Char16_t_Char32_t 유형과 키워드가 처음에 왜 필요한지 당신은 아마 궁금 때 형식 정의 uint_least16_tuint_least32_t은 이미 사용 가능합니다. 새로운 유형 이 해결하는 주된 문제는 오버로드입니다. 그것은 std::basic_string <wchar_t> 구별되는 전문 같은 std::basic_string<_Char16_t> 같은 _Char16_t_Char32_t 인수를 기능 과부하, 만들고 지금 가능합니다.그들은 various standard draft papers에서 언급 한대로

2) u16stringu32string은 실제로 C++ 0X의 일부가 아니라 GCC'isms 있습니다. 그들은 새로운 <string> 헤더에 포함됩니다. 같은 기사에서 인용 :

표준 라이브러리는 다음과 같은 표준 클래스 등 형식 정의 wstring, wcout에 유사하게 _Char16_t_Char32_t 형식 정의를 제공합니다 :

filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,string

+0

정말 고맙습니다. 정말 도움이되었습니다. – Artyom

+1

표준 초안에 따르면'char16/32_t'는 typedef가 아닌 키워드입니다. 누가 옳은가? – Philipp

+0

gcc 버전 4.7.3에서 char16_t/char32_t는 키워드입니다. 나는 확인했다. 'int32_t' (typedef)라는 변수를 정의 할 수는 있지만'char32_t' (키워드)는 정의 할 수 없습니다. –