不能把我的头包裹在这个周围是一个真正的耻辱……
我正在使用法语 Windows (XP) 中的法语版本的 Visual Studio (2008)。发送到输出窗口的字符串中的法语口音已损坏。 从 输出窗口输入同上。典型的字符编码问题,我输入 ANSI,得到 UTF-8 作为回报,或者类似的东西。当向输出窗口显示“硬编码”字符串时,什么设置可以确保字符保留在 ANSI 中?
编辑:
例子:
#include <iostream>
int main()
{
std:: cout << "àéêù" << std:: endl;
return 0;
}
将在输出中显示:
óúÛ¨
(此处编码为 HTML 以供您观赏)
我真的很想展示:
点点滴滴
原文由 MPelletier 发布,翻译遵循 CC BY-SA 4.0 许可协议
在我进一步讨论之前,我应该提到你所做的不符合 c/c++ 标准。 规范 在 2.2 中说明了哪些字符集在源代码中是有效的。里面的内容不多,所有使用的字符都是ascii。所以……下面的一切都是关于一个特定的实现(碰巧是美国语言环境机器上的 VC2008)。
首先,您的
cout
行上有 4 个字符,输出上有 4 个字形。所以问题不是 UTF8 编码之一,因为它将多个源字符组合成更少的字形。从您的源字符串到控制台上的显示,所有这些都起作用:
<<
如何解释您传入的编码字符串现在…
1和2是相当容易的。看起来编译器猜测源文件的格式,并将其解码为其内部表示。无论源编码是什么,它都会在当前代码页中生成字符串文字对应的数据块。我没有找到明确的细节/控制。
3更容易。除了控制代码,
<<
只是将数据向下传递给 char *。4 由
SetConsoleOutputCP
控制。它应该默认为您的默认系统代码页。您还可以通过GetConsoleOutputCP
您拥有哪一个(输入的控制方式不同,通过SetConsoleCP
)5是一个有趣的。我用 CP1252(西欧,windows)敲了敲头,想弄清楚为什么我不能让 é 正确显示。事实证明,我的系统字体没有该字符的字形,并且有用地使用了我的标准代码页的字形(大写 Theta,如果我不调用 SetConsoleOutputCP,我会得到相同的字形)。为了解决这个问题,我不得不将我在控制台上使用的字体更改为 Lucida Console(一种真正的字体)。
我从中学到了一些有趣的东西:
233 0
)那么……这对你意味着什么?以下是一些建议:
char * a = "é"; std::cout << (unsigned int) (unsigned char) a[0]
对我来说确实显示了 233,这恰好是 CP1252 中的编码。顺便说一句,如果你得到的是 “ÓÚÛ¨” 而不是你粘贴的,那么看起来你的 4 个字节在某处被解释为 CP850 。