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 . . . |
我很久以前读过这篇文章,并认为我理解与字符集相关的问题,但显然不是这样。我将不胜感激这个问题的解决方案以及对正在发生的事情以及如何避免将来出现类似问题的良好解释。
- 也许源文件本身没有正确编码。它的编码是什么?
-
IIRC 控制台不能很好地支持非代码页字符。你的工具提示有用吗?
-
@NiklasB .:我不确定如何检查?我正在使用 Visual Studio 2008 创建一个新项目和上例中的源文件。我不确定如何检查源文件本身的编码…?在项目属性中,我尝试了 Use Multi-byte Character Set 和 Use Unicode Character Set ,输出没有区别。
-
@Rup:我必须修改很多代码才能使其与 wstring 一起使用,所以我想在进行更改并发现它们没有解决问题之前先尝试一个较小的项目。
由于您使用的是 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 变量中表示。它不会显示为 a€? 但会显示为 ? …为什么会导致崩溃?遇到此字符时,您是否猜想代码中可能出现的问题?
-
在不知道您的代码如何处理这些字符串的情况下,很难说。也许您可以提供更多信息?一般来说,这个字符可能在您的代码支持的字符集之外,并且不能优雅地处理这种情况。 ?只是OEM char set 中char 的解释。这可能不是您的代码使用的。
-
我同意,没有代码很难说(代码库很大)。我不确定要提供哪些信息,因为我无法追踪代码无法处理字符的位置。感谢您的帮助/解释,因为它帮助我更好地理解了问题。
由于您正在处理 Unicode 字符,如果您在项目属性中将字符集设置为使用 Unicode 字符集将是合适的。
另一个可能的问题是源文件的编码。使用 Unicode 字符时的最佳实践是让您的源文件以 UTF-8 编码,尤其是您定义像这样的字符串文字的文件。请注意,没有 BOM 的 UTF-8 可能会很麻烦,因为 Visual Studio 需要此 BOM 才能正确解释文件内容。转换您的文件(我为此使用记事本)并将其转换为以 UTF-8
编码
-
我在 NPP 中尝试了相同的方法(保存为 UTF-8 或 UCS-2),但没有帮助(尽管我使用了没有 VS 的原始 cl)。我认为问题在于控制台不理解输出。
-
我的经验是,如果程序使用 Unicode 字符集并且没有正确显示字符串文字,很可能是因为源文件的编码错误。
-
是的,我也是这么想的(见我的评论),但我刚才试了一下,这不是问题。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/268915.html