Ответ 1
Решения зависят от платформы. В Windows используйте MultiByteToWideChar и Функции WideCharToMultiByte API. На платформах Unix/Linux iconv библиотека довольно популярна.
Я как бы новичок в использовании строк и указателей Unicode, и я не знаю, как работает преобразование в unicode в ascii и versa-versa. Следующее - это то, что я пытаюсь сделать,
const wchar_t *p = L"This is a string";
Если бы я хотел преобразовать его в char*
, как бы преобразование работало с преобразованием wchar_t*
в char*
и наоборот?
или по значению с использованием объекта класса wstring
to string
и наоборот
std::wstring wstr = L"This is a string";
Если я прав, можете ли вы просто скопировать строку в новый буфер без преобразования?
Решения зависят от платформы. В Windows используйте MultiByteToWideChar и Функции WideCharToMultiByte API. На платформах Unix/Linux iconv библиотека довольно популярна.
В будущем (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);
С++ сам по себе не предлагает эту функциональность. Вам понадобится отдельная библиотека, например libiconv.
C Стандартные функции библиотеки: mbstowcs
и wcstombs
Преобразование из 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));
Вы не можете отменить это просто: 汉 существует в Юникоде, но не в ASCII, так как бы вы его "конвертировали"?
Алгоритм widen() преобразует char
в wchar_t
:
char a;
a = 'a';
whcar_t wa = cin.widen(a);
Конечно, вы должны положить его в цикл. И разрешите *;
Противоположность достигается narrow()