2012-07-26 76 views
0

我在与cin.get()问题已经设置字符的ASCII码不同:cin.get()ASCII码是比代码

虽然得到一个字符,我将其转换为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中的结果相同。

回答

1

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

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

我不确定值229来自哪里,但几乎可以肯定的是,这是因为使用了不同的代码页来为该字符赋值。例如,也许code page 852

+0

我猜测229字符是在控制台窗口中使用OEM代码页852。 – 2012-07-26 19:37:38

+0

@MichaelBurr,我只是想到了自己。它花了很多试验和错误。它是有道理的,这将被一个控制台窗口使用。 – 2012-07-26 19:40:38

+0

我试过这个脚本来得到我的应用使用的字符集: cout << setlocale(LC_ALL,“”)<< endl; 结果是:斯洛伐克斯洛伐克.1250,所以Windows 1250,当我看那张Win1250代码表时,有一个是242,但我的结果仍然是229 - cp852 – jakubinf 2012-07-27 12:14:50

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()已经返回int,并且unsigned char可以隐式转换为int

+0

我尝试使用wstring和wchar_t,因为它写在那里,所以我用wcout和cin替换了cout wcin,还添加了这些标题,但结果仍然相同 - 229 – jakubinf 2012-07-27 08:41:49

0

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

当给定不是ASCII的字符时,PHP ord()和C++ ord()均承诺未定义的结果。