2

對於NetBeans插件我想用特定的字符串和特定字符集更改文件(在NetBeans編輯器中打開)的內容。爲了達到這個目的,我用EditorCookie打開文件(一個DataObject),然後通過向我的數據對象的StyledDocument插入一個不同的字符串來更改內容。如何使用特定字符集寫入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小端編碼將字符串轉換爲字節數組,然後使用JRE的默認編碼從這些字節創建String

所以,這裏的漁獲:

一個String沒有編碼。

在Java中這是一個序列號爲char的事實並不重要。用'char'替代'載體鴿子',淨效應將是相同的。

如果要將String寫入具有給定編碼的字節流中,則需要在所創建的Writer對象上指定所需的編碼。同樣,如果您想要使用給定的編碼將字節流讀入String,那麼您需要配置Reader以使用所需的編碼。

但是您的StyledDocument對象的方法名稱是.insertString();你應該.insertString()你的String對象原樣;不要按照你的方式改變它,因爲這是錯誤的,如上所述。

+0

謝謝你的解釋!但是,如果我使用'insertString',那麼JRE的默認編碼會被採用,對吧?所以也許我應該修改'EditorKit'來查看是否可以改變'EditorKit'使用的'Reader'的編碼。 – 2014-11-23 19:02:15

+0

不確定;你有沒有試過只是插入字符串?另外,爲什麼BOM在一開始? – fge 2014-11-23 19:06:18

+0

我試圖插入字符串,因爲它是。看起來不錯,但如果我在另一個編輯器中打開該文件而不是NetBeans,那麼此編輯器無法將該文件識別爲UTF-16-BE。這就是爲什麼我要在開始時編寫BOM,以便其他編輯可以輕鬆檢測到我保存的文件的字符集。 – 2014-11-23 19:12:50

相關問題