C++11有将宽字符字符串std::wstring从/转换到utf8表示的工具:std::codecvt、std::codecvt_utf8、std::codecvt_utf8_utf16等。
哪个窗口应用程序可以将常规的宽字符Windows字符串std::wstring转换为utf8 std::string?它总是在不配置区域设置的情况下工作吗?
发布于 2016-05-31 07:26:52
取决于你是如何转换它们的。
您需要指定源编码类型和目标编码类型。
wstring不是一种格式,它只是定义一种数据类型。
现在人们通常说"Unicode",意思是UTF16,这就是Microsoft 使用的东西,这通常是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平台上使用时(就像使用多字节编译时一样),它不是UTF8。他们使用ANSI。
更具体地说,您的窗口使用的默认编码语言。
另外,请注意wstring is not exactly the same as UTF-16。
在以Unicode编译时,windows命令要求使用以下格式:
命令a-多字节- ANSI
命令W- Unicode - UTF16
发布于 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::pathstd::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表示。
https://stackoverflow.com/questions/37514496
复制相似问题