Преобразование строк в Юникоде и наоборот - PullRequest
14 голосов
/ 24 января 2011

Я новичок в использовании Unicode строк и указателей, и я понятия не имею, как работает преобразование в Unicode в ASCII и наоборот.Вот что я пытаюсь сделать:

const wchar_t *p = L"This is a string";

Если бы я хотел преобразовать его в char*, как бы конвертация работала с преобразованием wchar_t* в char* и наоборот?

или по значению, используя wstring к string объект класса и наоборот

std::wstring wstr = L"This is a string";

Если я прав, вы можете просто скопировать строку в новый буфер без преобразования?

Ответы [ 6 ]

22 голосов
/ 24 января 2011

В будущем (VS 2010 уже поддерживает его) это будет возможно в стандарте C ++ (наконец-то!):

#include <string>
#include <locale>

std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
const std::wstring wide_string = L"This is a string";
const std::string utf8_string = converter.to_bytes(wide_string);
3 голосов
/ 25 января 2011

Преобразование из ASCII в Unicode и наоборот довольно тривиально.По своей конструкции первые 128 значений Unicode совпадают с ASCII (фактически, первые 256 равны ISO-8859-1).

Таким образом, следующий код работает в системах, где char - это ASCII иwchar_t - это Unicode:

const char* ASCII = "Hello, world";
std::wstring Unicode(ASCII, ASCII+strlen(ASCII));

Вы не можете изменить это так просто: 汉 существует в Unicode, но не в ASCII, так как бы вы «конвертировали» его?

3 голосов
/ 24 января 2011

C Стандартные библиотечные функции: mbstowcs и wcstombs

3 голосов
/ 24 января 2011

Решения зависят от платформы. В Windows используйте функции API MultiByteToWideChar и WideCharToMultiByte . На платформах Unix / linux iconv библиотека довольно популярна.

3 голосов
/ 24 января 2011

C ++ сам по себе не предлагает эту функциональность.Вам понадобится отдельная библиотека, например libiconv .

0 голосов
/ 24 января 2011

Алгоритм widen () преобразует char в wchar_t:

char a;
a = 'a';
whcar_t wa = cin.widen(a);

Конечно, вы должны поместить это в цикл. И решить *; Противоположность достигается narrow()

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