Похоже, что std::codecvt_utf8
хорошо подходит для преобразования std::wstring
->utf8
. Он прошел все мои тесты. (Приложение Windows, Visual Studio 2015, Windows 8 с локалием EN)
Мне нужен способ конвертировать имена файлов в UTF8. Поэтому мой тест касается имен файлов.
В моем приложении я использую boost::filesystem::path
1.60.0 для обработки пути к файлу. Он работает хорошо, но не способен правильно преобразовывать имена файлов в UTF8. Внутренняя версия Windows boost::filesystem::path
использует std::wstring
для хранения пути к файлу. К сожалению, встроенное преобразование в std::string
работает плохо.
Тестовый пример:
- создать файл со смешанными символами
c:\test\皀皁皂皃的
(некоторые случайные азиатские символы)
- реж сканирования с
boost::filesystem::directory_iterator
, получить boost::filesystem::path
файла
- преобразовать его в
std::string
через встроенные конверсия filenamePath.string()
- вы получаете
c:\test\?????
. Азиатские символы преобразуются в '?'. Нехорошо.
boost::filesystem
использует std::codecvt
внутренне. Он не работает для преобразования std::wstring
->std::string
.
Вместо возведения в boost::filesystem::path
преобразования можно определить функцию преобразования, как это (original snippet):
std::string utf8_to_wstring(const std::wstring & str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
Затем вы можете конвертировать FilePath в UTF8 легко: utf8_to_wstring(filenamePath.wstring())
. Он работает отлично.
Он работает для любого пути к файлу. Я тестировал строки ASCII c:\test\test_file
, азиатские строки c:\test\皀皁皂皃的
, русские строки c:\test\абвгд
, смешанные струны c:\test\test_皀皁皂皃的
, c:\test\test_абвгд
, c:\test\test_皀皁皂皃的_абвгд
. Для каждой строки я получаю действительное представление UTF8.
Возможный дубликат [Преобразовать wstring в строку, закодированную в UTF-8] (http://stackoverflow.com/questions/4358870/convert-wstring-to-string-encoded-in-utf-8) – IInspectable
@IInsp ectable Я разместил этот вопрос после прочтения страницы, которую вы упомянули))) Я не вижу ясного ответа на свой вопрос на этой странице. –
Неужели [это] (http://stackoverflow.com/a/12903901/1889329) не отвечает на ваши вопросы вопрос? Согласно [комментарий] (http://stackoverflow.com/questions/4358870/convert-wstring-to-string-encoded-in-utf-8#comment32601904_12903901) * «[t] его работы для Windows, если вы используете VS2012 или позже"*. – IInspectable