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

时间:2012-07-26 19:14:34

标签: c++

我遇到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,它必须与ord()在PHP中的结果相同。

3 个答案:

答案 0 :(得分:1)

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

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

我不确定229的值来自何处,但几乎可以肯定,因为正在使用不同的代码页为字符赋值。例如,也许code page 852

答案 1 :(得分:1)

问题是您的控制台正在从code page 852读取字符,其中ň在代码点229(0xE5)处编码,但您希望其值在ISO 8859-2(也称为拉丁语) -2),其中ň在代码点242(0xF2)处编码。

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

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

此外,这与您的问题无关,但您的ord()功能无效。 cin.get()已经返回intunsigned char可以隐式转换为int

答案 2 :(得分:0)

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

当给定非ASCII字符时,PHP ord()和C ++ ord()都会保证未定义的结果。