конвертировать из char в char16 t



Мой конфиг:




  • компилятор: gnu gcc 4.8.2

  • я компилирую с C++11

  • Платформа / ОС: Linux 64bit Ubuntu 14.04.1 LTS


У меня есть такой метод:



static inline std::u16string StringtoU16(const std::string &str) {
const size_t si = strlen(str.c_str());
char16_t cstr[si+1];
memset(cstr, 0, (si+1)*sizeof(char16_t));
const char* constSTR = str.c_str();
mbstate_t mbs;
memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state
size_t ret = mbrtoc16 (cstr, constSTR, si, &mbs);
std::u16string wstr(cstr);
return wstr;
}


Мне очень нужно преобразование между char в char16_T (через std:: string и std:: u16string для облегчения управления памятью), но независимо от размера входной переменной str, он будет возвращать только первый символ. Если str= "Hello", то он вернет"H". Я не знаю, что случилось, мой ... метод. Значение ret равно 1.

746   2  

2 ответов:

Я не знал, что mbrtoc16 () может обрабатывать только один символ за раз.. ну и черепаха. Вот тогда код, который я генерирую, и работает как заклинание:

static inline std::u16string StringtoU16(const std::string &str) {
    std::u16string wstr = u"";
    char16_t c16str[3] = u"\0";
    mbstate_t mbs;
    for (const auto& it: str){
        memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state
        memmove(c16str, u"\0\0\0", 3);
        mbrtoc16 (c16str, &it, 3, &mbs);
        wstr.append(std::u16string(c16str));
    }//for
    return wstr;
}

Для его двойника (когда нужен один путь, рано или поздно понадобится другой путь):

static inline std::string U16toString(const std::u16string &wstr) {
    std::string str = "";
    char cstr[3] = "\0";
    mbstate_t mbs;
    for (const auto& it: wstr){
        memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state
        memmove(cstr, "\0\0\0", 3);
        c16rtomb (cstr, it, &mbs);
        str.append(std::string(cstr));
    }//for
    return str;
}

Имейте в виду, что c16rtomb будет потерян, если символ не может быть преобразован из char16_t в char (может в конечном итоге напечатать кучу '?"в зависимости от вашей системы), но он будет работать без жалоб.

Mbrtoc16 () преобразует один символ и возвращает количество многобайтовых символов, которые были использованы для преобразования char16_t.

Чтобы осуществить это преобразование, общий подход таков:

A) вызов mbrtoc16().

B) сохраните преобразованный символ, пропустите количество символов, которые были использованы.

C) вы израсходовали всю строку, которую хотели преобразовать? Если нет, вернитесь к шагу A.

Кроме того, возможно преобразование ошибки. Вы должны проверить возвращаемое значение из mbrtoc16 () и сделать все, что вы хотите сделать, чтобы обработать ошибки преобразования (исходная многобайтовая строка не является допустимой).

Наконец, не следует предполагать, что максимальный размер строки char16_t будет равен или меньше размера многобайтовой строки. Вероятно, так оно и есть; но в каком-то странном месте я предполагаю, что теоретически это может быть больше.

Comments

    Ничего не найдено.