我们在引擎中内置了一个注释系统,允许程序员为各种公开的变量/对象添加注释,然后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