2013-08-20 159 views
0

我有一段代碼,做工精細在NetBeans啓動時(此代碼替換的content.xml文件中的一些字符串從的.odt文件中提取):JAVA字符串編碼轉換問題

String cont = new String(Utils.readBinaryFile(path + "/content.xml")); 
for (Patterns p : patterns) { 
    cont = cont.replaceAll(p.search.replaceAll("\\{", "\\\\{"), p.replace.replaceAll("\n", "<text:line-break/>").replaceAll("\\{", "\\\\{")); 
} 
Utils.saveToFile(path + "/content.xml", cont.getBytes("UTF-8"), false); 

/** 
* Saves the binary data to the file, if append is FALSE, the data in the file is overwritten 
* @param fileName 
* @param data 
* @param append 
*/ 
    public static void saveToFile(String fileName, byte[] data, boolean append) { 
    try { 
     try (FileOutputStream out = new FileOutputStream(fileName, append)) { 
     out.write(data); 
     } 
    } catch (IOException iOException) { 
     System.err.println(iOException.getMessage()); 
    } 
    } 

如果我在命令行中使用Windows中的代碼,如java -jar ....保存在文件中的字符已損壞轉換。 我意識到它來自於事實,Windows在編碼CP1250的情況下工作,當我開始我的代碼爲java -jar使用CP1250。問題是如何使這工作正常?我不在命令行中使用該代碼,但是在applet中,從applet運行的代碼與從CP1250中的命令行運行的代碼完全相同。

我讀到編碼,但似乎沒有什麼幫助了我很多文章,但在命令行與指定的編碼運行:

java -Dfile.encoding=utf-8 -jar Office.jar 

解決的問題。

意識到我當時就想參數傳遞給我的小程序標籤:

<object classid='clsid:8AD9C840-044E-11D1-B3E9-00805F499D93' width='500' height='30'> 
    <param name='codebase_lookup' value='false'> 
    <param name='archive' value='" . ServerURL . "/applets/Office/Office.jar'> 
    <param name='code' value='OfficeApplet'> 
    <param name='java_arguments' value='-Dfile.encoding=utf-8' 
    <param name='data' value='" . $dataJSON . "'> 
    <comment> 
     <embed 
      codebase_lookup='false' 
      archive='" . ServerURL . "/applets/Office/Office.jar' 
      code='OfficeApplet' 
      width='500' 
      height='30' 
      java_arguments='-Dfile.encoding=utf-8' 
      data='" . $dataJSON. "' 
      type='application/x-java-applet' 
     > 
      <noembed> 
       You need JRE 1.7+ 
      </noembed> 
      </embed> 
     </comment> 
</object> 

正如你可以看到我使用java_arguments標籤,但它似乎並沒有幫助或也許java_arguments被傳遞到JVM以錯誤的方式或論據被忽略,我不知道。有人可以幫我解決這個問題嗎?我使用Windows 7 64位。 在此先感謝。

回答

0

您寫道:

String cont = new String(Utils.readBinaryFile(path + "/content.xml")); 

String(byte[])構造函數轉換字節使用平臺的默認編碼,可以是任何字符。最簡單的解決方法是使用允許指定編碼的構造函數;例如:

String cont = new String(Utils.readBinaryFile(path + "/content.xml"), "UTF-8"); 
+0

我確信我也是這樣做的,仍然有編碼問題(我有一條評論線)。 然後我意識到我犯了錯誤。在我寫的原始代碼中 String cont = new String(Utils.readBinaryFile(path +「/content.xml","UTF-8」)); 而不是 String cont = new String(Utils.readBinaryFile(path +「/content.xml"),"UTF-8」); 非常相似,但只有第二個以正確的方式進行轉換。謝謝。 – norbi771

0

問題是Utils.readBinaryFile(path + "/content.xml")可能不使用UTF-8編碼從文件中讀取數據。我的猜測是你在util方法中使用了默認編碼,並且這種變化從系統到系統。

你需要做的是解決這個問題,在readBinaryFile()中指定文件的編碼。

InputStreamReader是你的朋友。

+0

不幸的是,輸入文件的編碼可能會改變,我不想強​​制這個。感謝Joni發出的第二個答案,我在代碼中發現了這個BUG,無論如何感謝您的時間和建議。 – norbi771