Проблема преобразования 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, а не наоборот.