读取ASCII之外的字符

时间:2009-11-30 05:48:14

标签: c++ unicode ascii

我的一位朋友向我展示了阅读角色产生意外行为的情况。读取角色'¤'导致他的程序崩溃。我得出结论,'¤'是十六进制的164,所以它超过了ASCII范围。

我们注意到'¤'上的行为,但任何字符> 127似乎都显示出问题。问题是我们如何通过char可靠地读取这些字符char?

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

3 个答案:

答案 0 :(得分:2)

您的系统使用UTF-8字符编码(应该如此),因此字符“¤”会使您的程序读取字节序列C2 A4。由于char是一个字节,因此它一次读取一个字节。查看wchar_t以及相应的wcinwcout流来读取多字节字符,但我不知道它们支持哪些编码或者如何使用区域设置。

另外,你的程序正在输出无效的UTF-8,所以你真的不应该看到这两个字符 - 我的系统上出现了问号。

(这是一个挑剔的,有些偏离主题,但你的while(input)应该是while(cin),否则你将获得无限循环。)

答案 1 :(得分:1)

很难说为什么你的朋友的程序在没有看到代码的情况下崩溃,但可能是因为你使用char作为数组的索引。由于常规ASCII范围之外的字符将超出signed char的限制,因此char将最终为负数。

答案 2 :(得分:1)

将'input'声明为unsigned char而不是