[英]Converting C++ std::wstring to utf8 with std::codecvt_xxx
C ++ 11具有将宽字符串std::wstring
从/转换为utf8表示的工具: std::codecvt
, std::codecvt_utf8
, std::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.