我的一个 friend 向我展示了一种情况,即阅读字符会产生意想不到的行为。读取字符“¤”导致他的程序崩溃。我能够得出结论,“¤”是十进制的 164,因此它超出了 ASCII 范围。
我们注意到 '¤' 上的行为,但任何大于 127 的字符似乎都显示了问题。问题是我们如何可靠地逐字符读取此类字符?
int main(int argc, const char *argv[])
{
char input;
do
{
cin >> input;
cout << input;
cout << " " << setbase(10) << (int)input;
cout << " 0x" << setbase(16) << (int)input;
cout << endl;
} while(input);
return 0;
}
masse@libre:temp/2009-11-30 $ ./a.out
¤
 -62 0xffffffc2
¤ -92 0xffffffa4
最佳答案
您的系统正在使用 UTF-8 字符编码(它应该如此),因此字符“¤”导致您的程序读取字节序列 C2 A4
。由于 char
是一个字节,它一次读取一个。查看 wchar_t
和相应的 wcin
和 wcout
流以读取多字节字符,尽管我不知道它们支持哪些编码或它们如何支持玩转语言环境。
此外,您的程序正在输出无效的 UTF-8,因此您真的不应该看到这两个字符 — 我的系统上出现问号。
(这是一个吹毛求疵的话题,但你的 while(input)
应该是 while(cin)
,否则你会得到一个无限循环。)
关于c++ - 读取 ASCII 以外的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1818025/