clang: преобразование const char16_t * (UTF-16) в строку wstring (UCS-4) - PullRequest
3 голосов
/ 17 декабря 2011

Я пытаюсь преобразовать строки в кодировке UTF-16 в UCS-4

Если я правильно понимаю, C ++ 11 обеспечивает это преобразование через codecvt_utf16.

Мой код выглядит примерно так:

#include <iostream>
#include <locale>
#include <memory>
#include <codecvt>
#include <string>

using namespace std;

int main()
{
    u16string s;

    s.push_back('h');
    s.push_back('e');
    s.push_back('l');
    s.push_back('l');
    s.push_back('o');

    wstring_convert<codecvt_utf16<wchar_t>, wchar_t> conv;
    wstring ws = conv.from_bytes(reinterpret_cast<const char*> (s.c_str()));

    wcout << ws << endl;

    return 0;
}

Примечание: явные push_backs позволяют обойти тот факт, что моя версия clang (Xcode 4.2) не имеет строковых литералов Unicode.

Когда код запускается, я получаю исключение завершения. Я делаю что-то незаконное здесь? Я думал, что это должно работать, потому что const char *, который я передал в wstring_convert, закодирован в UTF-16, верно? Я также считал, что проблема является порядком байтов, но я проверил, что это не так.

1 Ответ

9 голосов
/ 17 декабря 2011

Две ошибки:

1) * Перегрузка 1003 *, которая принимает одну const char*, ожидает строку байтов с нулевым символом в конце, но ваш второй байт равен '\ 0'.

2) ваша система, вероятно, имеет младший порядок, поэтому вам нужно преобразовать UTF-16LE в UCS-4:

#include <iostream>
#include <locale>
#include <memory>
#include <codecvt>
#include <string>

using namespace std;

int main()
{
    u16string s;

    s.push_back('h');
    s.push_back('e');
    s.push_back('l');
    s.push_back('l');
    s.push_back('o');

    wstring_convert<codecvt_utf16<wchar_t, 0x10ffff, little_endian>,
                     wchar_t> conv;
    wstring ws = conv.from_bytes(
                     reinterpret_cast<const char*> (&s[0]),
                     reinterpret_cast<const char*> (&s[0] + s.size()));

    wcout << ws << endl;

    return 0;
}

Протестировано с Visual Studio 2010 SP1 для Windows и CLang ++ / libc ++ - svn для Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...