0

我有一个问题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() 的结果相同。

4

3 回答 3

1

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

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

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

于 2012-07-26T19:36:24.320 回答
1

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

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

要使用 Unicode 数据,请参阅此问题。在 Unicode 中,ň是代码点 U+0148。

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

于 2012-07-26T19:37:41.680 回答
0

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

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

于 2012-07-26T19:40:13.190 回答