Как написать в 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
объект как есть; не преобразуйте это так, как вы, так как это неверно, как описано выше.