Проблема преобразования C/C++ unsigned char в JAVA

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

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

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

3 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам