Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 4字节UTF-8序列的字节2无效,但仅在执行JAR时有效?_Java_Windows_Encoding_Utf 8_Xml Serialization - Fatal编程技术网

Java 4字节UTF-8序列的字节2无效,但仅在执行JAR时有效?

Java 4字节UTF-8序列的字节2无效,但仅在执行JAR时有效?,java,windows,encoding,utf-8,xml-serialization,Java,Windows,Encoding,Utf 8,Xml Serialization,我有一个java程序,我用TransformerFactory转换从SQLServer数据库中获取的XML字符串,并将其写入文件,然后使用该文件生成PDF 问题是,当我用netbeans执行它时,它工作得很好,但是如果我在projectdist文件夹中执行jar,我会得到一个“无效的4字节UTF-8序列的字节2” 将XML字符串的编码更改为UTF-8后,现在它在jar中也可以正常工作 所以我的问题是,为什么在更改编码之前,在NetBeans中运行项目而不是从JAR文件运行项目时,它会起作用 我只

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

问题是,当我用netbeans执行它时,它工作得很好,但是如果我在projectdist文件夹中执行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);
    // 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);
    }
}

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


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

您是否碰巧使用了使用“特定于平台的默认编码”的转换机制之一?(例如,它假设UTF-8代表UTF-16。)并且,JVM在这两种情况下使用的是相同的吗?发布相关代码将是。。。有用。谢谢回答!现在添加了代码。我不确定,其中一种机制是什么?我认为SQLServer返回的是unicode编码的xml字符串,这就是为什么我会出现这个错误,但为什么它会在不改变编码的情况下通过netbeans工作呢?我打赌在每种情况下都会使用不同的JVM:这个命题可以被确认还是被拒绝?可能就是这样!非常感谢,让我检查一下,然后再给你回复。确认这一点最简单的方法是什么?我不使用netbeans:),但是
java-version
应该会给出有用的东西。
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);
    }
}