将斯堪的纳维亚字母从wstring转换为字符串

时间:2018-03-06 10:22:24

标签: string character-encoding c++17 wstring

目标

将包含ÅåÄäÖöÆæØø的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转换为字符串?

1 个答案:

答案 0 :(得分:2)

所以,我根据我的评论进行了一些额外的阅读和实验。

转向解决方案非常简单。只需将CP_UTF8更改为CP_ACP

...然而 如果您在the MSDN method documentation的行之间阅读,Microsoft建议实际应该使用CP_UTF8CP_ACP的注释为:

  

这个值在不同的计算机上可能会有所不同,即使是相同的   网络。它可以在同一台计算机上更改,导致存储   数据变得无法挽回。此值仅适用于   临时使用和永久存储应使用UTF-16或UTF-8   可能的。

此外,整个方法的注释如下:

  

ANSI代码页在不同的计算机上可以是不同的,也可以是不同的   单个计算机已更改,导致数据损坏。为了   最一致的结果,应用程序应该使用Unicode,例如   UTF-8或UTF-16,而不是特定的代码页,除非遗留   标准或数据格式阻止使用Unicode。如果使用Unicode   应用程序应该使用标记数据流   协议允许的适当编码名称。 HTML和XML文件   允许标记,但文本文件不允许。

因此即使这个CP_ACP - 解决方案适用于我的测试用例,仍然可以看看它是否是一个总体上很好的解决方案。