cin.get() ASCII 码与代码中已设置字符的 ASCII 码不同

Posted

技术标签:

【中文标题】cin.get() ASCII 码与代码中已设置字符的 ASCII 码不同【英文标题】:cin.get() ASCII code is different than ASCII code of already set char in code 【发布时间】:2012-07-26 19:14:33 【问题描述】:

cin.get() 有问题:

在获取 char 时,我将其转换为 int,但是当我通过控制台输入时,结果与已在代码中设置时不同。

示例如下:

int ord(unsigned char chr)
    int ret=int(chr);
    return ret;

int main()
    unsigned char chr='ň'; //This is my constant character 'ň' for now
    cout<<ord(chr)<<endl; //outputs : 242 ,which is alright for me, because it is same as in php and that I need
    chr=cin.get(); //now I change my constant character 'ň' to 'ň' written through console 
    cout<<ord(chr)<<endl; //outpus : 229 ,which is wrong for me, because its not same as in PHP 

我该如何解决这个问题?

我要的是 242,不是 229,它必须和 PHP 中 ord() 的结果一样。

【问题讨论】:

【参考方案1】:

源文件和控制台输入通过两个不同的过程来解释字符并将其转换为代码。第一个被输入文本编辑器并由编译器转换,第二个由操作系统和控制台库解释。

值 242 对应于 ISO/IEC 8859-2 或 Windows 1250 代码页中的字符。

我不确定值 229 的来源,但几乎可以肯定这是因为正在使用不同的代码页来为字符分配值。比如code page 852。

【讨论】:

我猜 229 字符来自在控制台窗口中使用 OEM 代码页 852。 @MichaelBurr,我自己才想出来的。这需要大量的试验和错误。这将被控制台窗口使用是有道理的。 我尝试了这个脚本来获取我的应用程序使用的字符集:cout @DieMeine,输入的编码不是由 C++ 语言环境决定的,而是由 Cmd 窗口决定的。有一个chcp 命令,但我不知道它的效果如何。 嗯,它有效,但只是部分。当我将 chcp 更改为 1250 并按键盘上的“ň”时,cin.get() 输出“˛”,但是当我将控制台输出 (˛) 标记并复制到此处时,它会粘贴 ň:D【参考方案2】:

问题是您的控制台正在从code page 852 读取字符,其中ň 在代码点229 (0xE5) 处编码,但您希望它的值在ISO 8859-2(又名Latin-2)中,其中@ 987654325@ 在代码点 242 (0xF2) 处编码。

我强烈建议您放弃这种方法并专门使用 Unicode,它不存在这些类型的问题。处理非 Unicode 编码(例如 ISO 8859 变体和 DOS 代码页)只会让人头疼。

要使用 Unicode 数据,see this question。在 Unicode 中,ň 是代码点 U+0148。

另外,这与您的问题无关,但您的 ord() 函数没用。 cin.get() 已经返回 int,并且 unsigned char 可以隐式转换为 int

【讨论】:

我尝试使用写在那里的 wstring 和 wchar_t,所以我将 cout 替换为 wcout,将 cin 替换为 wcin,还添加了这些标题,但结果仍然相同 - 229【参考方案3】:

问题是字符ň不是ASCII字符,因此没有ASCII码。

当给定一个非 ASCII 字符时,PHP ord() 和 C++ ord() 都承诺未定义的结果。

【讨论】:

以上是关于cin.get() ASCII 码与代码中已设置字符的 ASCII 码不同的主要内容,如果未能解决你的问题,请参考以下文章

ascii码与二进制码有何区别?

C语言ASCII码与字母如何转换?求详解

JavaScript里面如何实现ascii码与字符的转换

ASCII码与BCD码的区别

ascii码与二进制码有何区别?

cin.get()!='n'