首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C++ std::wstring转换为utf8和std::codecvt_xxx

将C++ std::wstring转换为utf8和std::codecvt_xxx
EN

Stack Overflow用户
提问于 2016-05-29 20:12:55
回答 2查看 7.3K关注 0票数 4

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

哪个窗口应用程序可以将常规的宽字符Windows字符串std::wstring转换为utf8 std::string?它总是在不配置区域设置的情况下工作吗?

EN

回答 2

Stack Overflow用户

发布于 2016-05-31 07:26:52

取决于你是如何转换它们的。

您需要指定源编码类型和目标编码类型。

wstring不是一种格式,它只是定义一种数据类型。

现在人们通常说"Unicode",意思是UTF16,这就是Microsoft 使用的东西,这通常是wstring包含的内容。

因此,从UTF8转换到UTF16的正确方法是:

代码语言:javascript
复制
     std::string utf8String = "blah blah";

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

而反过来:

代码语言:javascript
复制
     std::wstring utf16String = "blah blah";

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

更让人困惑的是

当您在windows平台上使用时(就像使用多字节编译时一样),它不是UTF8。他们使用ANSI

更具体地说,您的窗口使用的默认编码语言。

另外,请注意wstring is not exactly the same as UTF-16

在以Unicode编译时,windows命令要求使用以下格式:

命令a-多字节- ANSI

命令W- Unicode - UTF16

票数 6
EN

Stack Overflow用户

发布于 2016-05-30 17:39:42

看来std::codecvt_utf8对于转换std::wstring -> utf8很有效。它通过了我所有的测试。(Windows应用程序,Visual 2015,带有EN locale的Windows 8)

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

在我的应用程序中,我使用boost::filesystem::path 1.60.0来处理文件路径。它工作良好,但无法正确地将文件名转换为UTF8。在内部,Windows版本的boost::filesystem::path使用std::wstring来存储文件路径。不幸的是,内建到std::string的转换效果很差。

测试用例:

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

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

与内置boost::filesystem::path转换不同,您可以将转换函数定义为如下(original snippet):

代码语言:javascript
复制
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表示。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37514496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档