【问题标题】:How to deal with the Unicode characters in C++如何处理 C++ 中的 Unicode 字符
【发布时间】:2012-03-03 02:23:21
【问题描述】:

我们的引擎中内置了一个评论系统,允许程序员为各种公开的变量/对象放置 cmets,然后 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,并认为我理解与字符集相关的问题,但显然不是这样。我将不胜感激这个问题的解决方案以及对正在发生的事情以及如何避免将来出现类似问题的良好解释。

【问题讨论】:

  • 可能源文件本身没有正确编码。它的编码是什么?
  • IIRC 控制台不能很好地支持非代码页字符。你的工具提示有用吗?
  • @NiklasB.:我不确定如何检查?我正在使用 Visual Studio 2008 创建一个新项目和上例中的源文件。我不确定如何检查源文件本身的编码...?在项目属性中,我尝试了Use Multi-byte Character SetUse Unicode Character Set,输出没有区别。
  • @Rup:我必须修改很多代码才能使其与wstring 一起使用,所以我想在进行更改之前尝试一个较小的项目并发现它们没有修复问题。

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


【解决方案1】:

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

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

【讨论】:

  • 我可以做一个临时修复来获得一个固定的构建(例如,一旦遇到 unicode 字符就忽略它)?然后我将开始将所有字符串转换为wstring(这将需要相当长的时间)。
  • 如果你跳过所有值 > 127 的字符,你只会得到 ASCII 字符。
  • 有利于 UTF8 的是您可以继续使用常规字符串,即您不需要将所有字符串都转换为 wstring。相反,您需要在调用 unicode (UTF16) Windows API 时进行转换。
  • 我仍然对某些事情感到困惑。问题字符可以用char 变量表示。它不会显示为,而是显示为Æ ...为什么会导致崩溃?遇到此字符时,您猜猜代码中可能出了什么问题?
  • 在不知道您的代码如何处理这些字符串的情况下很难说。也许您可以提供更多信息?一般来说,这个字符可能在您的代码支持的字符集之外,并且不能优雅地处理这种情况。 Æ 只是 OEM 字符集中的字符的解释。这可能不是您的代码使用的。
【解决方案2】:

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

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

编码

【讨论】:

  • 我在 NPP 中尝试了相同的方法(保存为 UTF-8 或 UCS-2)但没有帮助(尽管我使用了没有 VS 的原始 cl)。我认为问题在于控制台不理解输出。
  • 我的经验是,如果程序使用Unicode字符集并且不能正确显示字符串文字,很可能是因为源文件的编码错误。
  • 是的,我也是这么想的(见我的评论),但我刚刚尝试过,这不是问题。
猜你喜欢
  • 1970-01-01
  • 2011-04-07
  • 2011-11-20
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2014-06-14
  • 2013-12-30
相关资源
最近更新 更多