Файл не сохраняется в кодировке UTF-8, даже если я установил кодировку в UTF-8 - PullRequest
0 голосов
/ 08 октября 2009

Когда я проверяю свой файл с помощью Notepad ++, он находится в кодировке ANSI. Что я тут не так делаю?

OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file), "UTF8");
try
        {           
            out.write(text);
            out.flush();
        } finally
        {
            out.close();
        }

UPDATE:

Теперь это решено, причина, по которой jboss не понимает мой xml, не была кодировкой, а назвала мой xml. Спасибо всем за помощь, даже там действительно не было никаких проблем ...

Ответы [ 6 ]

2 голосов
/ 08 октября 2009

Нет такого понятия, как простой текст. Проблема в том, что приложение декодирует символьные данные, не сообщая, какую кодировку использовать данные.

Хотя многие приложения Microsoft полагаются на наличие метки порядка байтов для обозначения файла Unicode, это ни в коем случае не является стандартом. В FAQ по Unicode BOM сказано больше.

Вы можете добавить спецификацию к выводу, написав символ '\uFEFF' в начале потока. Подробнее здесь . Этого должно быть достаточно для приложений, использующих спецификации.

2 голосов
/ 08 октября 2009

Если вы создаете файл XML (как подразумевают ваши комментарии), я бы настоятельно рекомендовал использовать библиотеки XML для вывода этих и записи правильного заголовка кодировки XML , В противном случае ваша кодировка символов не будет соответствовать стандартам XML, и другие инструменты (например, ваш экземпляр JBoss) по праву будут жаловаться.

    // Prepare the DOM document for writing
    Source source = new DOMSource(doc);

    // Prepare the output file
    File file = new File(filename);
    Result result = new StreamResult(file);

    // Write the DOM document to the file
    Transformer xformer = TransformerFactory.newInstance().newTransformer();
    xformer.transform(source, result);
1 голос
/ 08 октября 2009

UTF-8, в общем случае, довольно неотличим от ANSI. Поэтому, когда вы пишете текст в файл и кодируете текст с помощью UTF-8, в общем случае он выглядит как ANSI для всех, кто открывает файл.

  • UTF-8 - это 1 байт на символ для всех символов ASCII, как и ANSI.
  • UTF-8 имеет все те же байты для символов ASCII, что и ANSI.
  • UTF-8 не имеет специальных символов заголовка, как нет в ANSI.

Только когда вы начинаете входить в не-ASCII кодовые точки, все начинает выглядеть по-другому.

Но в общем случае побайтные, ANSI и UTF-8 идентичны.

1 голос
/ 08 октября 2009

Если нет спецификации (а Java не выводит ее для UTF8, она даже не распознает ее), текст идентичен в кодировке ANSI и UTF8, если используются только символы в диапазоне ASCII. Поэтому Notepad ++ не может обнаружить какую-либо разницу.

(И, похоже, проблема с с UTF8 в Java в любом случае ...)

0 голосов
/ 08 октября 2009

Вы пытались написать спецификацию в начале файла? Спецификация - единственное, что может сказать редактору, что файл находится в UTF-8. В противном случае файл UTF-8 может выглядеть просто как Latin-1 или расширенный ANSI.

Вы можете сделать это так,

public final static byte[] UTF8_BOM = {(byte)0xEF, (byte)0xBB, (byte)0xBF};
...
OutputStream os = new FileOutputStream(file);
os.write(UTF8_BOM);
os.flush();
OutputStreamWriter out = new OutputStreamWriter(os, "UTF8");
try
    {                       
            out.write(text);
            out.flush();
    } finally
    {
            out.close();
    }
0 голосов
/ 08 октября 2009

Зарегистрированный тип IANA - «UTF-8», а не «UTF8». Однако Java должна выдавать исключение для недопустимых кодировок, так что, вероятно, это не проблема.

Я подозреваю, что проблема в блокноте. Изучите текст с помощью программы hexdump, и вы увидите, что он правильно закодирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...