2014-02-10 5 views
0

this 라이브러리를 사용하여 C++에서 UTF16에서 UTF8로 변환합니다.C++에서 utf8 라이브러리를 사용하는 UTF 16에서 UTF8

예는 UTF8로 UTF16을 변환 할 수있는 다음과 같은 방법을 제시한다

template <typename u16bit_iterator, typename octet_iterator> 
octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result); 

내가 UTF16의 문자가 char 배열을 가지고 utf16to8의 정의가 주어진다

unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e}; 
vector<unsigned char> utf8result; 
utf16to8(utf16string, utf16string + 5, back_inserter(utf8result)); 
assert (utf8result.size() == 10);  

. UTF16 문자 배열의 크기 (유효 문자 수)를 모르는 경우에도이 라이브러리를 사용할 수 있는지 알려주실 수 있습니까?

+1

잠깐, "크기를 아는 것"대신 "크기를 모른다"는 뜻입니까? –

+0

@JohnZwinck, yes – Chani

+0

@JohnZwinck std :: string을 초기화하기 위해 문자 포인터를 사용했는데 이제 문자열의 반복기를 사용하려고합니다. 그것은 이제 일하다. – Chani

답변

1

아니요. 분명히 알 수없는 크기의 컨테이너에 저장된 데이터로는 의미있는 작업을 수행 할 수 없습니다. 은 보유한 요소의 수를 알고 있어야합니다.

0

아마도 C++ 11에서 소개 된 u16string을 사용할 수 있습니다.

#ifdef WIN32  
#include <codecvt> 
#else 
#include <uchar.h> 
#endif 

string toUTF8(const u16string& u16str) { 
    string result; 

#ifdef WIN32 
    wstring_convert<codecvt_utf8_utf16<char16_t>, char16_t> convertor; 
    result = convertor.to_bytes(u16str); 
#else 
    mbstate_t mbs; 

    mbrlen(NULL, 0, &mbs); /* initialize mbs */ 

    int length = 0; 
    char buffer [MB_CUR_MAX]; 

    for (int i= 0; i < u16str.size(); i++){ 
     length = c16rtomb(buffer, u16str[i], &mbs); 

     if ((length == 0) || (length>MB_CUR_MAX)){ 
      break; 
     } 

     for (int j = 0; j < length;j++){ 
      result += buffer[j]; 
     } 
    } 
#endif 

    return result; 
}