java 8 напишите utf-8 кодировка бред - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь получить рабочий текстовый файл utf-8.Работая, я имею в виду, что он должен выглядеть правильно в Firefox и libreoffice.

Для записи я использую:

PrintWriter writer = new PrintWriter(savepath, "UTF-8");

Для чтения с Java я использую:

      InputStreamReader isr = new InputStreamReader(new FileInputStream(loadpath), Charset.forName("UTF-8"));
      BufferedReader br = new BufferedReader(isr);

При повторном чтении и отображении в java это корректно.

При использовании libreoffice или firefox (кодировка установлена ​​в юникод) отображаются «бессмысленные» символы.

Пример текста:

C'est vrai   (Java) The french "That's true" is shown correct

Cest vrai  (firefox -set to unicode) the "'" becomes a square with "0092" inside

РЕДАКТИРОВАТЬ:

CÂ’est vrai (firefox -set to middle european (windows) encoding)

РЕДАКТИРОВАТЬ2:

writer.println("Cest vrai");
writer.flush();

https://imgur.com/a/CLL3eVK

РЕДАКТИРОВАТЬ 3: Хорошо, я попробовал это сейчас с

writer.println("C"+"\u0092"+" est vrai");
writer.flush();

Это приводит к (Firefox установлен в Unicode): https://imgur.com/qGRr9sC

В импорте libreoffice calc это выглядит даже немного иначе (квадрат пуст): https://imgur.com/MNQNDWo

1 Ответ

0 голосов
/ 17 декабря 2018

Вы попали в не столь очевидную ловушку.U + 0092 не является допустимым символом Unicode.Windows 1252 близко к Latin1, но добавляет некоторые символы.Например, ПРАВИЛЬНАЯ ОДНОКВАЖНАЯ КАРТОЧКА () - это U + 2019, но она сопоставлена ​​с '\x92' в кодировке Windows 1252 и вообще не доступна в истинной латинице 1.

Если вы хотите написать ееправильно в Java, вы должны использовать "C\u2019est vrai".

Это означает, что операции кодирования являются правильными, но что символ Юникода неправильный.И Firefox правильно показывает 0092 в квадрате как несуществующий юникодный символ.


После еще одного исследования я могу сказать, что символы с кодом от 0x80 до 0x9f опасны .0x81, 0x8d, 0x8f, 0x90 и 0x9d вообще не отображаются в кодировке Windows 1252, все остальные отображаются в символы Unicode выше 256. Ниже приведен список, содержащий код в кодировке Windows 1252, соответствующее значение Unicode, символ иего имя (благодаря модулю unicodedata Python)

Different € 0x20ac 0x80 EURO SIGN
Not mapped 0x81
Different ‚ 0x201a 0x82 SINGLE LOW-9 QUOTATION MARK
Different ƒ 0x192 0x83 LATIN SMALL LETTER F WITH HOOK
Different „ 0x201e 0x84 DOUBLE LOW-9 QUOTATION MARK
Different … 0x2026 0x85 HORIZONTAL ELLIPSIS
Different † 0x2020 0x86 DAGGER
Different ‡ 0x2021 0x87 DOUBLE DAGGER
Different ˆ 0x2c6 0x88 MODIFIER LETTER CIRCUMFLEX ACCENT
Different ‰ 0x2030 0x89 PER MILLE SIGN
Different Š 0x160 0x8a LATIN CAPITAL LETTER S WITH CARON
Different ‹ 0x2039 0x8b SINGLE LEFT-POINTING ANGLE QUOTATION MARK
Different Œ 0x152 0x8c LATIN CAPITAL LIGATURE OE
Not mapped 0x8d
Different Ž 0x17d 0x8e LATIN CAPITAL LETTER Z WITH CARON
Not mapped 0x8f
Not mapped 0x90
Different ‘ 0x2018 0x91 LEFT SINGLE QUOTATION MARK
Different ’ 0x2019 0x92 RIGHT SINGLE QUOTATION MARK
Different “ 0x201c 0x93 LEFT DOUBLE QUOTATION MARK
Different ” 0x201d 0x94 RIGHT DOUBLE QUOTATION MARK
Different • 0x2022 0x95 BULLET
Different – 0x2013 0x96 EN DASH
Different — 0x2014 0x97 EM DASH
Different ˜ 0x2dc 0x98 SMALL TILDE
Different ™ 0x2122 0x99 TRADE MARK SIGN
Different š 0x161 0x9a LATIN SMALL LETTER S WITH CARON
Different › 0x203a 0x9b SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
Different œ 0x153 0x9c LATIN SMALL LIGATURE OE
Not mapped 0x9d
Different ž 0x17e 0x9e LATIN SMALL LETTER Z WITH CARON
Different Ÿ 0x178 0x9f LATIN CAPITAL LETTER Y WITH DIAERESIS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...