Как написать в StyledDocument с определенной кодировкой?

Для плагина NetBeans я хочу изменить содержимое файла (который открывается в редакторе NetBeans) с определенной строкой и определенной кодировкой. Для этого я открываю файл (DataObject) с помощью EditorCookie, а затем меняю содержимое, вставляя другую строку в StyledDocument моего объекта данных.

Однако у меня есть ощущение, что файл всегда сохраняется как UTF-8. Даже если я напишу отметку в файле. Я делаю что-то неправильно?

Это мой код:

...

EditorCookie cookie = dataObject.getLookup().lookup(EditorCookie.class);
String utf16be = new String("\uFEFFHello World!".getBytes(StandardCharsets.UTF_16BE));

NbDocument.runAtomic(cookie.getDocument(), () -> {
  try {
    StyledDocument document = cookie.openDocument();
    document.remove(0, document.getLength());
    document.insertString(0, utf16be, null);
    cookie.saveDocument();
  } catch (BadLocationException | IOException ex) {
    Exceptions.printStackTrace(ex);
  }
});

Я также попробовал этот подход, который тоже не работает:

... 

EditorCookie cookie = dataObject.getLookup().lookup(EditorCookie.class); 

NbDocument.runAtomic(cookie.getDocument(), () -> {
  try {
    StyledDocument doc = cookie.openDocument();

    String utf16be = "\uFEFFHello World!";
    InputStream is = new ByteArrayInputStream(utf16be.getBytes(StandardCharsets.UTF_16BE));

    FileObject fileObject = dataObject.getPrimaryFile();
    String mimePath = fileObject.getMIMEType();
    Lookup lookup = MimeLookup.getLookup(MimePath.parse(mimePath));
    EditorKit kit = lookup.lookup(EditorKit.class);

    try {
      kit.read(is, doc, doc.getLength());
    } catch (IOException | BadLocationException ex) {
      Exceptions.printStackTrace(ex);
    } finally {
      is.close();
    }

    cookie.saveDocument();
  } catch (Exception ex) {
    Exceptions.printStackTrace(ex);
  }
});

1 ответ

Ваша проблема, вероятно, здесь:

String utf16be = new String("\uFEFFHello World!".getBytes(StandardCharsets.UTF_16BE));

Это не будет делать то, что вы думаете, что делает. Это преобразует вашу строку в байтовый массив, используя кодировку UTF-16 с прямым порядком байтов, а затем создаст String из этих байтов, используя кодировку JRE по умолчанию.

Итак, вот подвох:

Stringне имеет кодировки

Тот факт, что в Java это последовательность charс не имеет значения. Замените "char" на "почтовые голуби", чистый эффект будет таким же.

Если вы хотите написать String Для байтового потока с заданной кодировкой вам необходимо указать кодировку, Writer объект, который вы создаете. Точно так же, если вы хотите прочитать поток байтов в String используя данную кодировку, это Reader которую вы должны настроить для использования нужной вам кодировки.

Но твой StyledDocument имя метода объекта .insertString(); Вам следует .insertString() ваш String объект как есть; не преобразуйте это так, как вы, так как это неверно, как описано выше.

Другие вопросы по тегам