将包含重音字符的UTF-8字符串转换为UTF-16。

3

我正在尝试将包含一些重音字符的std::string转换为std::wstring,如C++ Convert string (or char*) to wstring (or wchar_t*)中所述,但我的程序抛出了错误的转换异常。

我使用的是Windows 10和MSVC 2022 v17.4.1,语言设置为C++17。

这是一个最小可重现的程序,演示了这个问题:

#include <iostream>
#include <string>
#include <locale>
#include <codecvt>

#pragma warning( disable : 4996  )

int main()
{
    std::string s{ "hello ê world" };
    
    try {
        std::wstring ws = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(s);
        std::wcout << ws << "\n";
    }
    catch (const std::exception& e) {
        std::cout << e.what() << "\n";
    }
}

非常感谢任何帮助将上述的 std::string 转换为 std::wstring


6
“*std::string s{ "hello ê world" };*” 这不一定是以UTF-8编码的。 - Nicol Bolas
2
如果你要处理Unicode和不同的文本编码,我建议使用ICU这样的库。请注意,std::codecvt_utf8在C++17中已被弃用。 - NathanOliver
3
如果您想测试您的代码,我建议您使用正确的字节序列显式初始化字符串。绝对不能保证源代码中的字符串文字编码为UTF-8。 - john
2
这可能有助于理解发生了什么:https://stackoverflow.com/a/67819605/1387438 基本上,在其中一个步骤中,您的编码不一致:源代码、编译、可执行文件、全局区域设置。请注意,MSVC 更喜欢使用您的系统区域设置,通常不是 UTF-8,而是某些特定国家的单字节编码。 - Marek R
1
@Aamir 好的,即使如此,wxString 可以使用 wxString::utf8_str() 转换为 UTF-8,然后可以用它来构造一个 std::string,因此你没有理由拥有一个对于 std::wstring_convert 解码无效的 std::string - Remy Lebeau
显示剩余9条评论
1个回答

2

你需要同时使用 /utf-8 编译器标志进行构建,并将文件保存为 UTF-8 格式。

在 Visual Studio 中将文件保存为 UTF-8 格式,可以从“另存为”对话框中选择“编码保存...”选项。

Save As dialog

你的字符串可能被读取为"hello ê world"或其他非UTF-8编码的字符串。

Visual Studio文档中可以得知:

如果没有找到字节顺序标记,它会假定源文件是以当前用户代码页编码的,除非你使用了/utf-8/source-charset选项来指定一个代码页。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接