unsigned char的问题。 我正在读取一个PPM图像文件,其中包含ASCII /扩展ASCII数据。
对于角色,例如。 '†', 在JAVA中,在将其读取为char并将其转换为int之后,其值为8224。 在C / C ++中,在将其作为unsigned char读取并将其转换为int之后,其值为160.
我如何阅读JAVA以获得160的价值?
以下C ++
unsigned char ch1 ='†';
char ch2 = '†';
cout << (int) ch1 << "\n"; // prints 160
cout << (int) ch2 << "\n"; // prints -96
在Java中,
char ch1 = '^';
char ch2 = '†';
System.out.println (" value : " + (int) ch1); // prints 94
System.out.println (" value :" + (byte) ch1); // prints 94
System.out.println (" value : " + (int) ch2); // prints 8224
System.out.println (" value :" + (byte) ch2); // prints 32
以下是一些例外情况 8224† 8226• 8800≠ 8482™ 8710Δ 8211 - 8221“ 8216' 9674◊ 8260 / 8249 < 8249 < 8734∞ 8747∫ 8364€ 8730√ 8804≤
以下是一些好的 94 ^ 102 f 112 p 119 w 126~ 196Ä 122 z 197Å 197Å
感谢任何帮助
答案 0 :(得分:4)
在C ++中,您在某些特定编码中使用“窄”字符,恰好将字符'†'定义为160.在其他编码中,160可能意味着其他内容,而字符“†”可能完全丢失。
在Java中,您始终在处理Unicode。 8660 = 0x2020 = U + 2020“DAGGER”。
要获得“160”,您需要将字符串转换为与C ++一样的编码。请参阅String.getBytes(charset)。
答案 1 :(得分:0)
IIRC Java使用16位表示字符(UNICODE?),除非你使用wchars,否则C ++通常不会。
我认为你最好不要让C ++使用Java使用的UNICODE字符,而不是相反。
答案 2 :(得分:0)
如果将C ++中的unsigned char 160写为单个字节,并使用InputStream.read(),则会得到160.这意味着哪个字符取决于假定的编码,但值160不变。