将包含ÅåÄäÖöÆæØø的wstring转换为C ++中的字符串。
C ++ 17,Visual Studio Community 2017,Windows 10 Pro 64位
我正在尝试将wstring转换为字符串,并已实现了建议的解决方案 https://stackoverflow.com/a/3999597/1997617
// This is the code I use:
// Convert a wide Unicode string to an UTF8 string
std::string toString(const std::wstring &wstr)
{
if (wstr.empty()) return std::string();
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
std::string strTo(size_needed, 0);
WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
return strTo;
}
到目前为止一切顺利。
我的问题是除了英文字母外,我还要处理斯堪的纳维亚字母(ÅåÄäÖöÆæØø)。请注意下面的输入wstring。
L"C:\\Users\\BjornLa\\Å-å-Ä-ä-Ö-ö Æ-æ-Ø-ø\\AEther Adept.jpg"
退回时已成为......
"C:\\Users\\BjornLa\\Å-å-Ä-ä-Ö-ö Æ-æ-Ø-ø\\AEther Adept.jpg"
...这给我带来了一些麻烦。
所以我想问一个经常被问到的问题,但只需要一点点补充:
如何在包含斯堪的纳维亚字符时将wstring转换为字符串?
答案 0 :(得分:2)
所以,我根据我的评论进行了一些额外的阅读和实验。
转向解决方案非常简单。只需将CP_UTF8
更改为CP_ACP
!
...然而
如果您在the MSDN method documentation的行之间阅读,Microsoft建议实际应该使用CP_UTF8
。 CP_ACP
的注释为:
这个值在不同的计算机上可能会有所不同,即使是相同的 网络。它可以在同一台计算机上更改,导致存储 数据变得无法挽回。此值仅适用于 临时使用和永久存储应使用UTF-16或UTF-8 可能的。
此外,整个方法的注释如下:
ANSI代码页在不同的计算机上可以是不同的,也可以是不同的 单个计算机已更改,导致数据损坏。为了 最一致的结果,应用程序应该使用Unicode,例如 UTF-8或UTF-16,而不是特定的代码页,除非遗留 标准或数据格式阻止使用Unicode。如果使用Unicode 应用程序应该使用标记数据流 协议允许的适当编码名称。 HTML和XML文件 允许标记,但文本文件不允许。
因此即使这个CP_ACP
- 解决方案适用于我的测试用例,仍然可以看看它是否是一个总体上很好的解决方案。