Преобразование строки в wstring, проблемы с кодировкой - PullRequest
2 голосов
/ 22 сентября 2011

Я читал Приложение Страуструпа (особое внимание к Locales и Codecvt). Страуструп не дает хорошего codecvt и расширяет пример (ИМХО). Я пытался выключить вещи из интернета без радости. Я также безуспешно пытался наполнить струнные потоки.

Может ли кто-нибудь показать (и объяснить) код для перехода от кодировки UTF-8 к кодировке UTF-16 (или UTF-32)? ПРИМЕЧАНИЕ: Я не знаю заранее размер строки ввода / вывода, поэтому я ожидаю, что решение должно использовать reserve и back_inserter. Пожалуйста, не используйте out.resize(in.length()*2).

Когда закончите, было бы замечательно, если бы код действительно работал (просто удивительно, сколько там сломанного кода). Пожалуйста, убедитесь, что следующие «круглые поездки». Байты ниже - это символ Хан для «кости» в UTF-8 и UTF- {16 | 32}.

const std::string n("\xe9\xaa\xa8");
const std::wstring w = L"\u9aa8";

Мои извинения за основной вопрос. В Windows я использую Win32 API, и у меня нет этих проблем при перемещении между кодировками.

Ответы [ 2 ]

4 голосов
/ 22 сентября 2011

Просто используйте UTF8-CPP :

std::wstring conversion; 
utf8::utf8to16(utf8_str.begin(), utf8_str.end() , back_inserter(conversion));

Предостережение: это будет работать, только если wchar_t имеет длину 2 байта (windows).

Для переносимого решения вы можете сделать:

std::vector<unsigned short> utf16line; // uint16_t if you can
utf8::utf8to16(utf8_line.begin(), utf8_line.end(), back_inserter(utf16line));

Но тогда вы теряете поддержку строк.Надеюсь, мы скоро получим char16_t.

2 голосов
/ 22 сентября 2011

Кажется довольно очевидным, что он курил травку.Что касается преобразований кодовой страницы, посмотрите не дальше, чем iconv !

...