繁体   English   中英

使用std :: codecvt_xxx将C ++ std :: wstring转换为utf8

[英]Converting C++ std::wstring to utf8 with std::codecvt_xxx

C ++ 11具有将宽字符串std::wstring从/转换为utf8表示的工具: std::codecvtstd::codecvt_utf8std::codecvt_utf8_utf16等。

Windows应用程序可以使用哪一个将常规宽字符串Windows字符串std::wstring为utf8 std::string 它是否始终无法配置区域设置?

取决于你如何转换它们。
您需要指定源编码类型和目标编码类型。
wstring不是一种格式,它只是定义了一种数据类型。

现在通常当一个人说“Unicode”时,一个意味着UTF16 ,这是Microsoft Windows使用的,这通常是wstring包含的内容。

那么,从UTF8转换为UTF16的正确方法:

     std::string utf8String = "blah blah";

     std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
     std::wstring utf16String = convert.from_bytes( utf8String );

反过来说:

     std::wstring utf16String = "blah blah";

     std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
     std::string utf8String = convert.to_bytes( utf16String );

并增加了混乱:
当你在Windows平台上使用std::string时(比如当你使用多字节编译时),它不是UTF8 他们使用ANSI
更具体地说,是Windows正在使用的默认编码语言。

另请注意, wstring与UTF-16不完全相同

在Unicode中编译时,windows API命令需要以下格式:

命令A - 多字节 - ANSI
命令W - Unicode - UTF16

似乎std::codecvt_utf8适用于转换std::wstring - > utf8 它通过了我所有的测试。 (Windows应用程序,Visual Studio 2015,带有EN语言环境的Windows 8)

我需要一种方法将文件名转换为UTF8。 因此我的测试是关于文件名。

在我的应用程序中,我使用boost::filesystem::path 1.60.0来处理文件路径。 它运行良好,但无法正确转换文件名为UTF8。 内部Windows版本的boost::filesystem::path使用std::wstring来存储文件路径。 不幸的是,对std::string内置转换很糟糕。

测试用例:

  • 用混合符号创建文件c:\\test\\皀皁皂皃的 (一些随机的亚洲符号)
  • 使用boost::filesystem::directory_iterator扫描boost::filesystem::directory_iterator ,获取boost::filesystem::path
  • 通过内置转换filenamePath.string()将其转换为std::string
  • 你得到c:\\test\\????? 亚洲符号转换为'?'。 不好。

boost::filesystem内部使用std::codecvt 它不适用于转换std::wstring - > std::string

您可以将转换函数定义为此( 原始代码段 ),而不是内置boost::filesystem::path转换:

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表示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM