2013-08-20 106 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