【问题标题】:Invalid byte 2 of 4-byte UTF-8 sequence, but only when executing JAR?4字节UTF-8序列的无效字节2,但仅在执行JAR时?
【发布时间】:2011-12-25 19:42:35
【问题描述】:

我有这个 java 程序,我在其中使用 TransformerFactory 转换从 SQL Server 数据库获取的 XML 字符串并将其写入文件,然后使用该文件生成 PDF。

问题是当我使用 netbeans 执行它时它工作正常,但是如果我在项目 dist 文件夹中执行 jar,我会得到一个“4 字节 UTF-8 序列的无效字节 2”。

在将 XML 字符串的编码更改为 UTF-8 后,现在它在 jar 中也可以正常工作了。

所以我的问题是,为什么在 NetBeans 中运行项目而不是在更改编码之前从 JAR 文件中运行项目时它会起作用?

仅在 Windows 中尝试过。

代码:

这是 SQL Server 查询(原始):

SQLXML xml = null;
String xmlString = "";
while (rs.next()){
    xml = rs.getSQLXML(1);
    xmlString = xml.getString();
}
return xmlString;

...并修改:

SQLXML xml = null;
String xmlString = "";
while (rs.next()){
    xml = rs.getSQLXML(1);
    // Note explicit UTF-8 encoding specified
    xmlString = new String(xml.getString().getBytes(),"UTF8");
 }
 return xmlString;

这里是转换:

public static void serialize(Document doc, OutputStream out) throws Exception {
    TransformerFactory tfactory = TransformerFactory.newInstance();
    try {
        Transformer serializer = tfactory.newTransformer();
        serializer.setOutputProperty("indent", "yes");
        serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        serializer.transform(new DOMSource(doc), new StreamResult(out));
    } catch (TransformerException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}

【问题讨论】:

  • 您是否偶然使用了一种使用“平台特定默认编码”的转换机制? (例如,它假设 UTF-8 代表 UTF-16。)而且,JVM 在两种情况下使用的相同吗?发布相关代码会......很有用。
  • 感谢您的回答!现在添加代码。我不确定,其中一种机制是什么?我认为 SQLServer 返回 xml 字符串 unicode 编码,所以这就是我收到该错误的原因,但为什么它会在不更改编码的情况下通过 netbeans 工作?
  • 我敢打赌,在每种情况下都使用了不同的 JVM:该提议可以被确认还是被拒绝?
  • 可能就是这样!非常感谢,让我检查一下,我会回复你。确认这一点的最简单方法是什么?
  • 我不使用netbeans :) 但是java -version 应该吐出有用的东西。

标签: java windows encoding utf-8 xml-serialization


【解决方案1】:

我在 Netbeans 中尝试了一个简单的应用程序,它显示 Charset.defaultCharset(),它返回“UTF-8”。 Eclipse 中的相同返回“MacRoman”。我在 Mac 上,在 Windows 上它会返回“cp-1252”。

所以是的,当您在 Netbeans 中运行应用程序时,它默认为 UTF-8 编码,这就是您在解析 XML 时没有任何问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2013-08-14
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多