c++ - 读取 ASCII 以外的字符

标签 c++ unicode ascii

我的一个 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 和相应的 wcinwcout 流以读取多字节字符,尽管我不知道它们支持哪些编码或它们如何支持玩转语言环境。

此外,您的程序正在输出无效的 UTF-8,因此您真的不应该看到这两个字符 — 我的系统上出现问号。

(这是一个吹毛求疵的话题,但你的 while(input) 应该是 while(cin),否则你会得到一个无限循环。)

关于c++ - 读取 ASCII 以外的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1818025/

相关文章:

c++ - 在 OpenCL 内核中实现半精度 float 据类型

c++ - 将 ETW 事件发送到全局 "Application"日志

C++ cin.fail() while 循环

sql-server - WHERE 等于条件返回映射的 Unicode(全角)结果

language-agnostic - ASCII图值得我花时间吗?

c++ - 从 vector 访问时,我的可变类的属性没有改变。 (调试)

macos - Qt 应用程序显示表情符号而不是 unicode 字符

c++ - 在 Windows 终端中输出 unicode 字符

sql-server - Url Decode T-SQL 函数未翻译超出 ascii 范围的字符

python - Python 中 Unicode HTML 转换为 ASCII