1

无符号字符的问题。我正在阅读一个 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 Å

任何帮助表示赞赏

4

3 回答 3

4

在 C++ 中,您在某些特定编码中使用“窄”字符,恰好将字符“†”定义为 160。在其他编码中,160 可能意味着其他东西,而字符“†”可能完全丢失。

在 Java 中,您总是在处理 Unicode。8660 = 0x2020 = U+2020“匕首”。

要获得“160”,您需要将字符串转换为您在 C++ 中使用的相同编码。请参阅String.getBytes(charset)

于 2010-09-02T20:41:05.770 回答
0

IIRC Java 对字符(UNICODE?)使用 16 位表示,而 C++ 通常不会,除非您使用 wchars。

我认为你最好尝试让 C++ 使用 Java 使用的 UNICODE 字符,而不是相反。

于 2010-09-02T20:33:44.690 回答
0

如果您在 C++ 中将 unsigned char 160 写为单个字节,并使用 InputStream.read() 您将得到 160。这意味着哪个字符取决于假定的编码,但值 160 不变。

于 2010-09-02T20:53:29.500 回答