Как сохранить китайские иероглифы в файл с Java?

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

Плюсы:

  • Не требуется установка дополнительных iframe и postMessage.

Минусы:

  • Будет предоставлять данные во всех субдоменах (а не только на www), поэтому, если вы не доверяете всем субдоменам, они могут не работать для вас.
  • Отправляет данные на сервер по каждому запросу. Невероятно, но в зависимости от вашего сценария, возможно, еще меньше работы, чем решение iframe / postMessage.
  • Если вы это делаете, почему бы просто не использовать файлы cookie напрямую? Зависит от вашего контекста.
  • Размер файла cookie 4K max, всего для всех файлов cookie для домена (спасибо Блэйку за то, что указали это в комментариях)

Я согласен с другими комментаторы, однако, похоже, что это должен быть конкретный вариант для localStorage, поэтому рабочие места не требуются.

10
задан Makoto 4 May 2012 в 05:15
поделиться

6 ответов

Здесь работают несколько факторов:

  • Текстовые файлы не имеют внутренних метаданных для описания их кодировки (для всех разговоры о налогах на угловые скобки, есть причины, по которым XML популярен)
  • Кодировка по умолчанию для Windows по-прежнему является 8-битным (или двухбайтовым) набором символов « ANSI » с ограниченным диапазоном значений - текст файлы, записанные в этом формате, не являются переносимыми
  • Чтобы отличить файл Unicode от файла ANSI, приложения Windows полагаются на наличие метки порядка байтов в начале файла ( не строго правда, - объясняет Раймонд Чен ). Теоретически, спецификация предназначена для того, чтобы сообщить вам последовательность (порядок байтов) данных. Для UTF-8, хотя есть только один порядок байтов, Приложения Windows полагаются на байты маркера, чтобы автоматически выяснить, что это Unicode (хотя вы заметите, что Notepad имеет опцию кодирования в своих диалогах открытия / сохранения).
  • Неверно говорить, что Java не работает, потому что это делает не записывать UTF-8 BOM автоматически. Например, в системах Unix было бы ошибкой записывать спецификацию в файл сценария, и многие системы Unix используют UTF-8 в качестве кодировки по умолчанию. Бывают случаи, когда вы не хотите этого в Windows, например, когда вы добавляете данные в существующий файл: fos = new FileOutputStream (FileName, Append);

Вот метод надежного добавления Данные UTF-8 в файл:

  private static void writeUtf8ToFile(File file, boolean append, String data)
      throws IOException {
    boolean skipBOM = append && file.isFile() && (file.length() > 0);
    Closer res = new Closer();
    try {
      OutputStream out = res.using(new FileOutputStream(file, append));
      Writer writer = res.using(new OutputStreamWriter(out, Charset
          .forName("UTF-8")));
      if (!skipBOM) {
        writer.write('\uFEFF');
      }
      writer.write(data);
    } finally {
      res.close();
    }
  }

Использование:

  public static void main(String[] args) throws IOException {
    String chinese = "\u4E0A\u6D77";
    boolean append = true;
    writeUtf8ToFile(new File("chinese.txt"), append, chinese);
  }

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

10
ответ дан 3 December 2019 в 16:30
поделиться

Если вы можете полагать, что кодировка символов по умолчанию - UTF-8 (или какая-либо другая кодировка Unicode), вы можете используйте следующее:

    Writer w = new FileWriter("test.txt");
    w.append("上海");
    w.close();

Самый безопасный способ - всегда явно указывать кодировку:

    Writer w = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8");
    w.append("上海");
    w.close();

PS Вы можете использовать любые символы Unicode в исходном коде Java, даже в качестве имен методов и переменных, если параметр -encoding для javac настроен правильно , Это делает исходный код более читабельным, чем экранированная форма \ uXXXX .

4
ответ дан 3 December 2019 в 16:30
поделиться

Будьте очень осторожны с предлагаемыми подходами. Даже указав кодировку для файла следующим образом:

Writer w = new OutputStreamWriter (new FileOutputStream ("test.txt"), "UTF-8");

не будет работать, если вы работаете в операционной системе. Система, как Windows. Даже установка системного свойства для file.encoding в UTF-8 не решает проблему. Это потому, что Java не может записать метку порядка байтов (BOM) для файла. Даже если вы указали кодировку при записи в файл, открытие того же файла в приложении, таком как Wordpad, будет отображать текст как мусор, потому что он не обнаружит спецификацию. Я попытался запустить примеры здесь в Windows (с кодировкой платформы / контейнера CP1252).

Следующая ошибка существует для описания проблемы в Java:

http: //bugs.sun. com / bugdatabase / view_bug.do? bug_id = 4508058

Решение на данный момент состоит в том, чтобы самостоятельно написать метку порядка байтов, чтобы обеспечить правильное открытие файла в других приложениях. См. Это для получения дополнительной информации о спецификации:

http://mindprod.com/jgloss/bom.html

и для более правильного решения см. Следующую ссылку:

http: //tripoverit.blogspot. com / 2007/04 / javas-utf-8-and-unicode-writing-is.html

3
ответ дан 3 December 2019 в 16:30
поделиться

Попробуйте это,

StringBuffer Shanghai_StrBuf=new StringBuffer("\u4E0A\u6D77");
    boolean Append=true;

    Writer out = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream(FileName,Append), "UTF8"));
    for (int i=0;i<Shanghai_StrBuf.length();i++) out.write(Shanghai_StrBuf.charAt(i));
    out.close();
1
ответ дан 3 December 2019 в 16:30
поделиться

Вот один из многих способов , По сути, мы просто указываем, что преобразование должно быть выполнено в UTF-8 перед выводом байтов в FileOutputStream:

String FileName = "output.txt";

StringBuffer Shanghai_StrBuf=new StringBuffer("\u4E0A\u6D77");
boolean Append=true;

Writer writer = new OutputStreamWriter(new FileOutputStream(FileName,Append), "UTF-8");
writer.write(Shanghai_StrBuf.toString(), 0, Shanghai_StrBuf.length());
writer.close();

Я вручную проверил это по изображениям на http://www.fileformat.info/info/unicode / char / . В будущем, пожалуйста, следуйте стандартам Java-кодирования, включая имена переменных в нижнем регистре. Это улучшает читаемость.

info / info / unicode / char / . В будущем, пожалуйста, следуйте стандартам Java-кодирования, включая имена переменных в нижнем регистре. Это улучшает читаемость.

info / info / unicode / char / . В будущем, пожалуйста, следуйте стандартам Java-кодирования, включая имена переменных в нижнем регистре. Это улучшает читаемость.

1
ответ дан 3 December 2019 в 16:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: