Проблема преобразования C / C ++ unsigned char в JAVA - PullRequest
1 голос
/ 03 сентября 2010

Проблема с неподписанным символом. Я читаю файл изображения PPM, который содержит данные в формате ASCII / Extended ASCII.

Для персонажа, например. '†', В JAVA, после чтения его как char и приведения типа в int его значение равно 8224. В C / C ++ после чтения его как беззнакового символа и приведения типа в 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 ф 112 р 119 Вт 126 ~ 196 Ä 122 з 197 Å 197 Å

Любая помощь приветствуется

Ответы [ 3 ]

4 голосов
/ 03 сентября 2010

В C ++ вы используете «узкие» символы в некоторой конкретной кодировке, в которой символ '†' определяется как 160. В других кодировках 160 может означать что-то другое, а символ '†' может вообще отсутствовать.

В Java вы всегда имеете дело с Unicode. 8660 = 0x2020 = U + 2020 "DAGGER".

Чтобы получить "160", вам нужно преобразовать вашу строку в ту же кодировку, которую вы используете в C ++. См. String.getBytes (charset) .

0 голосов
/ 03 сентября 2010

Если вы записываете беззнаковый символ 160 в C ++ как один байт и используете InputStream.read (), вы получите 160. Какой символ это означает, зависит от предполагаемой кодировки, но значение 160 остается неизменным.

0 голосов
/ 03 сентября 2010

IIRC Java использует 16-битное представление для символов (UNICODE?), А C ++ обычно этого не делает, если вы не используете wchars.

Я думаю, вам лучше попытаться заставить C ++ использовать символы UNICODE, которые использует Java, а не наоборот.

...