visual如何在C++中处理Unicode字符



我们在引擎中内置了一个注释系统,允许程序员为各种公开的变量/对象添加注释,然后GUI前端使用这些注释来获取工具提示和帮助。

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

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

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string someString = "successive attack that DOESN’T result";
    wstring someWString = L"successive attack that DOESN’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,并在调用Windows API之前将其转换为UTF16。此转换可以使用MultiByteToWideChar/WideCharToMultiByte来执行。

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

另一个可能的问题可能是源文件的编码。使用Unicode字符时的最佳实践是将源文件编码为UTF-8,尤其是定义字符串文字的文件,如以下文件。请注意,没有BOM的UTF-8可能会很麻烦,因为Visual Studio需要此BOM,以便能够正确地集成文件内容。转换您的文件(我使用Notepad++),并将其转换为UTF-8

最新更新