Java 如何使用特定的字符集写入StyledDocument?

Java 如何使用特定的字符集写入StyledDocument?,java,netbeans,character-encoding,netbeans-platform,styleddocument,Java,Netbeans,Character Encoding,Netbeans Platform,Styleddocument,对于NetBeans插件,我希望使用特定字符串和特定字符集更改文件(在NetBeans编辑器中打开)的内容。为了实现这一点,我用EditorCookie打开文件(数据对象),然后通过在数据对象的StyledDocument中插入不同的字符串来更改内容 然而,我有一种感觉,文件总是保存为UTF-8。即使我在文件中写了一个文件标记。我做错什么了吗 这是我的代码: ... EditorCookie cookie = dataObject.getLookup().lookup(EditorCookie

对于NetBeans插件,我希望使用特定字符串和特定字符集更改文件(在NetBeans编辑器中打开)的内容。为了实现这一点,我用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);
  }
});

你的问题可能在这里:

String utf16be = new String("\uFEFFHello World!".getBytes(StandardCharsets.UTF_16BE));
这不会像你想象的那样。这将使用UTF-16 little-endian编码将字符串转换为字节数组,然后使用JRE的默认编码从这些字节创建
字符串

所以,这里有一个陷阱:

字符串
没有编码。

在Java中,这是一个
char
s序列这一事实并不重要。将“信鸽”替换为“炭”,净效果将相同

如果要使用给定的编码将
字符串
写入字节流,则需要在创建的
编写器
对象上指定所需的编码。类似地,如果要使用给定的编码将字节流读入
字符串
,则需要配置
读取器
,以使用所需的编码


但是您的
StyledDocument
对象的方法名是
.insertString()
;你应该
.insertString()
你的
String
对象保持原样;不要像上面解释的那样改变它,因为这是错误的。

谢谢你的精彩解释!但是如果我使用
insertString
,那么就会采用JRE的默认编码,对吗?因此,也许我应该修改一下
EditorKit
,看看是否可以更改
EditorKit
使用的
读卡器的编码;您是否尝试按原样插入字符串?还有,为什么要在开始时插入BOM表?我尝试按原样插入字符串。看起来不错,但如果我在NetBeans以外的其他编辑器中打开该文件,则该编辑器无法将该文件识别为UTF-16-BE。这就是为什么我想在开始时编写BOM表,以便其他编辑器可以轻松地检测到我保存的文件的字符集。那么您的文件首先是如何创建的?我知道的唯一一个默认情况下用UTF-16编写文本文件的包是PowerShell;你不能让源代码用UTF-8写吗?我可以。但问题是,我正在编写一个NetBeans插件来支持它——因此我需要确保该插件可以用拉丁语1、utf-8、utf-8-bom、utf-16be或utf-16le编写文件,这些文件可以被其他IDE和编辑器检测到。因此,让我试试EditorKit方法,然后我会告诉您结果。:)如果您对我的插件感兴趣,可以在这里找到: