代码之家  ›  专栏  ›  技术社区  ›  Björn Larsson

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

  •  0
  • Björn Larsson  · 技术社区  · 7 年前

    球门

    在C++中将包含·的wstring转换为字符串。

    环境

    C++17、Visual Studio Community 2017、Windows 10 Pro 64位

    描述

    我正在尝试将wstring转换为string,并已实现了中建议的解决方案 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 回复  |  直到 7 年前
        1
  •  2
  •   Björn Larsson    7 年前

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

    解决方案非常简单。只要换一下 CP_UTF8 CP_ACP 哦!

    然而 微软建议人们实际上应该使用 CP\U UTF8 ,如果您在 the MSDN method documentation 。的注释 CP\U ACP 内容如下:

    此值在不同的计算机上可能不同,即使在同一台计算机上 网络它可以在同一台计算机上更改,从而存储 数据变得无法恢复地损坏。此值仅用于 临时使用和永久存储应使用UTF-16或UTF-8,如果 可能的

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

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

    所以即使这样 CP\U ACP -这个解决方案对于我的测试用例来说效果很好,但它是否是一个总体上好的解决方案还有待观察。