【问题标题】:JAVA string encoding conversion issuesJAVA字符串编码转换问题
【发布时间】:2013-08-22 08:27:10
【问题描述】:

在 netbeans 中启动时,我有一段代码工作正常(此代码替换了从 .odt 文件中提取的 content.xml 文件中的一些字符串):

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。问题是如何使它正常工作?我不在命令行中使用该代码,但在小程序中,从小程序运行的代码的行为与在 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 位。 提前致谢。

【问题讨论】:

    标签: java utf-8 character-encoding


    【解决方案1】:

    问题在于Utils.readBinaryFile(path + "/content.xml") 可能不使用 UTF-8 编码从文件中读取数据。我的猜测是您在 util 方法中使用了默认编码,并且这会因系统而异。

    您需要做的是在readBinaryFile() 中指定文件的编码。

    InputStreamReader 是你的朋友。

    【讨论】:

    • 很遗憾,输入文件的编码可以改变,我不想强​​求。感谢 Joni 发送的第二个答案,我在代码中找到了 BUG,无论如何感谢您的时间和建议。
    【解决方案2】:

    你写道:

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

    String(byte[]) 构造函数使用平台默认编码将字节转换为字符,该编码可以是任何字符。最简单的解决方法是使用允许指定编码的构造函数;例如:

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

    【讨论】:

    • 我确信我做了同样的事情,但编码仍然存在问题(我有一个注释行)。然后我意识到我犯了错误。在原始代码中,我写了 String cont = new String(Utils.readBinaryFile(path+ "/content.xml","UTF-8"));而不是 String cont = new String(Utils.readBinaryFile(path+ "/content.xml"),"UTF-8");非常相似,但只有第二个以正确的方式进行转换。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2010-10-21
    相关资源
    最近更新 更多