关于visual c:如何处理C中的Unicode字符

How to deal with the Unicode characters in C++

我们的引擎中内置了一个评论系统,允许程序员为各种暴露的变量/对象添加评论,然后由 GUI 前端用于工具提示和帮助。

最近,某些工具提示开始崩溃,在浪费了很多时间后,我找到了字符:a€?,除非我弄错了,否则它是一个 unicode 字符,在 ASCII 中不可用。

考虑到这个答案,我认为 wstring 会解决这个问题。在对更大的项目进行更改之前,我创建了一个测试项目以查看 wstring 是否可以解决问题。虽然项目没有崩溃,但 wstring 的行为与预期不同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string someString ="successive attack that DOESNa€?T result";
    wstring someWString = L"successive attack that DOESNa€?T result";

    cout << someString << endl;
    wcout << someWString << endl;

    return 0;
}

//Console Output//
successive attack that DOESN??T result
successive attack that DOESNPress any key to continue . . .

我很久以前读过这篇文章,并认为我理解与字符集相关的问题,但显然不是这样。我将不胜感激这个问题的解决方案以及对正在发生的事情以及如何避免将来出现类似问题的良好解释。


由于您使用的是 Visual Studio,我假设您使用的是 Windows。 Windows 控制台不支持 unicode。它使用 OEM 字符集。您可以使用 CharToOemW/OemToCharW 在两者之间进行转换。显然它不能代表所有的 unicode 字符。

Windows 使用 UTF16 作为其系统 API。如果您的工具提示使用 Windows API,则可能是您想要使用的 wstring。但是,您可以改用 UTF8 并将其转换为 UTF16,然后再调用 Windows API。可以使用 MultiByteToWideChar/WideCharToMultiByte 执行此转换。


由于您正在处理 Unicode 字符,如果您在项目属性中将字符集设置为使用 Unicode 字符集将是合适的。

另一个可能的问题是源文件的编码。使用 Unicode 字符时的最佳实践是让您的源文件以 UTF-8 编码,尤其是您定义像这样的字符串文字的文件。请注意,没有 BOM 的 UTF-8 可能会很麻烦,因为 Visual Studio 需要此 BOM 才能正确解释文件内容。转换您的文件(我为此使用记事本)并将其转换为以 UTF-8

编码