2014-02-10 2 views
0

Я использую библиотеку this для выполнения моих преобразований с UTF16 на UTF8 в C++.UTF 16 to UTF8 с использованием библиотеки utf8 в C++

Пример предлагает следующий способ преобразования UTF16 в utf8:

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

где определение utf16to8 определяется по формуле:

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

У меня есть массив символов, который имеет символы в UTF16 , Можете ли вы сказать мне, можно ли использовать эту библиотеку, если я не знаю размер (количество допустимых символов) моего массива символов UTF16?

+1

Подождите, вы имели в виду «не знаете размер» вместо «теперь знаете размер»? –

+0

@JohnZwinck, yes – Chani

+0

@JohnZwinck Я использовал указатель на символ для инициализации std :: string, и теперь я пытаюсь использовать итераторы строки. Теперь он работает. – Chani

ответ

1

Нет. Вы ничего не можете сделать с данными, хранящимися в контейнере неизвестного размера, очевидно. Вы должны знать, сколько элементов оно держит.

0

Для справки, возможно, вы можете использовать u16string, который введен в C++ 11.

#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; 
} 
Смежные вопросы