如何处理C ++中的Unicode字符

时间:2012-02-10 16:06:03

标签: c++ visual-c++ unicode ascii widestring

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

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

考虑this answer,我认为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 . . .

我在很久以前读过this article并且认为我理解了与字符集相关的问题,但事实显然并非如此。我将非常感谢这个问题的解决方案,以及对正在发生的事情以及如何避免将来出现类似问题的一个很好的解释。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

另一个可能的问题可能是源文件的编码。使用Unicode字符时的最佳做法是将源文件编码为 UTF-8 ,尤其是定义字符串文字的文件。请注意, UTF-8无BOM 可能很麻烦,因为Visual Studio需要此 BOM ,以便它可以正确地解释文件内容。转换你的文件(为此我使用 Notepad ++ )并将其转换为以 UTF-8

编码