DataOutputStream outStream;
Возможно, вам не нужен DataOutputStream для записи файла RTF.DataOutputStream предназначен для записи двоичных структур в файл, но RTF основан на тексте.Обычно для OutputStreamWriter установка соответствующего набора символов в конструкторе будет способом записи в текстовые файлы.
outStream.writeBytes (strJapanese);
В частности, это терпит неудачу, потому что writeBytes
действительно записывает байты, даже если вы передаете ему String.Гораздо более подходящим типом данных был бы byte[]
, но это только одно из тех мест, где Java обрабатывает байты и символы вводит в заблуждение.Он преобразует вашу строку в байты просто, беря младшие восемь бит каждой кодовой единицы UTF-16 и выбрасывая остальные.Это приводит к кодированию ISO-8859-1 с искаженной ерундой для всех символов, которых нет в ISO-8859-1.
byte[] b = strJapanese.getBytes("UTF-8");
String output = new String(b);
Это на самом деле ничего полезного не дает.Вы кодируете в байты UTF-8, а затем декодируете это обратно в строку, используя кодировку по умолчанию.Почти всегда ошибка касаться кодировки по умолчанию, так как она непредсказуема на разных машинах.
outStream.writeUTF(strJapanese);
Это было бы лучшим ударом при написании UTF-8, но это все же не совсем правильно, так как использует поддельные Java«Модифицированная кодировка UTF-8» и, что более важно, файлы RTF на самом деле не поддерживают UTF-8 и вообще не должны напрямую включать символы не-ASCII.
Традиционно символы не-ASCII из 128вверх должен быть записан как шестнадцатеричные байты, такие как \'80
, и кодировка для них указана, если она вообще есть, в экранированных шрифтах \fcharset
и \cpg
, которые очень, очень раздражают иметь дело, и нене предлагайте UTF-8 в качестве одного из вариантов.
В более современных RTF вы получаете \u1234x
выходов, как в ответе Дабблера (+1).Каждый escape кодирует одну кодовую единицу UTF-16, что соответствует Java char
, поэтому не так уж сложно заменить все символы, не входящие в ASCII, на их экранированные варианты.
Это поддерживается в Word 97и позже, но некоторые другие инструменты могут игнорировать Unicode и возвращаться к символу замены x
.
RTF - не очень хороший формат.