2010-09-02 24 views
1

無符號字符問題。 我正在讀取具有ASCII /擴展ASCII數據的PPM圖像文件。轉換C/C++無符號字符到JAVA的問題

對於一個字符,例如。 「†」, 在JAVA,讀取它作爲char和類型轉換轉換成int其值後是8224 在C/C++,讀它作爲一個無符號字符和類型轉換轉換成int其值後是160

如何將我在JAVA閱讀,以獲得價值160?

的followng 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^ 102f也 臺112p 119瓦特 126〜 196 Ä 122ž 197埃 197埃

任何幫助理解

回答

4

在C++中,您正在使用某些特定編碼中的「窄」字符來定義字符'†'爲160.在其他編碼中,160可能意味着其他編碼,字符'†'可能完全丟失。

在Java中,你總是處理Unicode。 8660 = 0x2020 = U + 2020「DAGGER」。

要獲得「160」,您需要將您的字符串轉換爲您在C++中使用的相同編碼。見String.getBytes(charset)

+0

感謝atzz,這是很好的解釋。 我現在試圖弄清楚在C++中使用charset的方式 謝謝!:) – metalhawk 2010-09-02 20:57:10

+1

@ ravikumar1:試試US-ASCII。如果這不起作用,請嘗試ISO-8859-1。 – Powerlord 2010-09-02 21:04:05

+0

謝謝Bemrose。我寫了一個小的fn來獲取字符集。我發現-96的命中(256-96 = 160)。謝謝大家的支持。 :)下面是我的測試fn: – metalhawk 2010-09-02 21:24:52

0

IIRC Java對字符使用16位表示法(UNICODE?),C++通常不會使用wchar。

我認爲你最好是讓C++使用Java使用的UNICODE字符而不是其他方式。

+0

嗨Timo, 感謝您的及時回覆。 我正在嘗試在JAVA中編寫我的應用程序。所以我需要一種方法從char†中獲得160。 :( – metalhawk 2010-09-02 20:38:42

+0

「UNICODE?」UTF-16更精確 – Powerlord 2010-09-02 21:01:55

0

如果將C++中的無符號字符160作爲單個字節寫出來並使用InputStream.read(),您將得到160.這意味着哪個字符取決於假定的編碼,但是值160不變。

+0

感謝Peter,我只想用JAVA編寫。我沒有一個首先運行的C++程序。簡單地說,我只用JAVA解碼,爲此我需要160個char† – metalhawk 2010-09-02 20:59:14