Java 转换器未从文档对象读取特殊字符

Java 转换器未从文档对象读取特殊字符,java,xml,xslt,encoding,utf-8,Java,Xml,Xslt,Encoding,Utf 8,我尝试从Document对象读取xml数据,然后使用transformer将Document对象中的数据呈现为pdf,使用XSL 我的代码是: Document doc = toXML(arg1,arg2); 文档包含如下数据: 伊尔基·内特梅利奥伊 带in标签 InputStream inputStream = new FileInputStream(xslFilePath); transformer = factory.newTransformer(new StreamSource(inp

我尝试从Document对象读取xml数据,然后使用transformer将Document对象中的数据呈现为pdf,使用XSL

我的代码是:

Document doc = toXML(arg1,arg2);
文档包含如下数据: 伊尔基·内特梅利奥伊 带in标签

InputStream inputStream = new FileInputStream(xslFilePath);
transformer = factory.newTransformer(new StreamSource(inputStream));
transformer.setParameter("encoding", "UTF-8");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(doc.getDocumentElement()), res);
xml中存在的特殊字符不会相应地呈现和显示

#lk码#m


我还将编码设置为UTF-8,但它仍然显示如上所示。

不清楚是什么导致了编码问题,因为我看不到您的文档是如何读取/构造的,以及转换结果是如何设置的。尝试下面的独立示例代码,该代码处理XSLT编码。也许您甚至可以逐步修改它,以使用您的实际数据,以便查看出现了什么问题

public static void main(String[] args) {
    try {
        String inputEncoding = "UTF-16";
        String xsltEncoding = "ASCII";
        String outputEncoding = "UTF-8";

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(bos, inputEncoding);
        osw.write("<?xml version='1.0' encoding='" + inputEncoding + "'?>");
        osw.write("<root>İlkyönetmeliği</root>"); osw.close();
        byte[] inputBytes = bos.toByteArray();
        bos.reset();

        osw = new OutputStreamWriter(bos, xsltEncoding);
        osw.write("<?xml version='1.0' encoding='" + xsltEncoding + "'?>");
        osw.write("<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>");
        osw.write("<xsl:template match='@*|node()'><xsl:copy><xsl:apply-templates select='@*|node()'/></xsl:copy></xsl:template>");
        osw.write("</xsl:stylesheet>"); osw.close();
        byte[] xsltBytes = bos.toByteArray();
        bos.reset();

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document d = db.parse(new InputSource(new InputStreamReader(new ByteArrayInputStream(inputBytes), inputEncoding)));
        // if encoding declaration correct, use: Document d = db.parse(new InputSource(new ByteArrayInputStream(inputBytes)));
        System.out.println(XPathFactory.newInstance().newXPath().evaluate("/root[1]", d));

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer(new StreamSource(new InputStreamReader(new ByteArrayInputStream(xsltBytes), xsltEncoding)));
        // if encoding declaration correct, use: Transformer t = tf.newTransformer(new StreamSource(new ByteArrayInputStream(xsltBytes)));
        StreamResult sr = new StreamResult(new OutputStreamWriter(bos, outputEncoding));
        t.setOutputProperty(OutputKeys.ENCODING, outputEncoding);
        t.transform(new DOMSource(d.getDocumentElement()), sr);
        byte[] outputBytes = bos.toByteArray();

        Scanner s = new Scanner(new InputStreamReader(new ByteArrayInputStream(outputBytes), outputEncoding));
        String output = s.useDelimiter("</>").next(); // read all
        s.close();

        System.out.println(output);
    } catch (Exception ex) {
        ex.printStackTrace(System.err);
    }
publicstaticvoidmain(字符串[]args){
试一试{
字符串inputEncoding=“UTF-16”;
字符串xsltEncoding=“ASCII”;
字符串outputEncoding=“UTF-8”;
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
OutputStreamWriter osw=新的OutputStreamWriter(bos,inputEncoding);
osw.写(“”);
osw.write(“İlkyönetmeliği”);osw.close();
byte[]inputBytes=bos.toByteArray();
bos.reset();
osw=新的OutputStreamWriter(bos、xsltEncoding);
osw.写(“”);
osw.写(“”);
osw.写(“”);
osw.write(“”);osw.close();
字节[]xsltBytes=bos.toByteArray();
bos.reset();
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
文档d=db.parse(新的InputSource(新的InputStreamReader(新的ByteArrayInputStream(inputBytes),inputEncoding));
//如果编码声明正确,则使用:documentd=db.parse(newinputsource(newbytearrayinputstream(inputBytes));
System.out.println(XPathFactory.newInstance().newXPath().evaluate(“/root[1]”,d));
TransformerFactory tf=TransformerFactory.newInstance();
Transformer t=tf.newTransformer(新的StreamSource(新的InputStreamReader(新的ByteArrayInputStream(xsltBytes),xsltEncoding));
//如果编码声明正确,则使用:Transformer t=tf.newTransformer(newstreamsource(newbytearrayinputstream(xsltBytes));
StreamResult sr=新的StreamResult(新的OutputStreamWriter(bos,outputEncoding));
t、 setOutputProperty(OutputKeys.ENCODING,outputEncoding);
t、 转换(新的DOMSource(d.getDocumentElement()),sr);
byte[]outputBytes=bos.toByteArray();
扫描仪s=新扫描仪(新的InputStreamReader(新的ByteArrayInputStream(outputBytes),outputEncoding));
字符串输出=s.useDelimiter(“”).next();//全部读取
s、 close();
系统输出打印项次(输出);
}捕获(例外情况除外){
例如printStackTrace(System.err);
}
示例代码将应用于包含非ASCII字符的最小输入

我输出字符串以检查是否已使用XPath在文档中正确解析它。如果您知道如何使用XPath查找(中间)文档,则可能需要检查它

注意,如果存在,解析器将尝试提取XML处理指令(PI)中声明的编码默认情况下,在读取XML文件时。它假定实际编码和声明的编码相同。如果它们不同或PI缺失,则可以强制执行实际编码,例如使用
InputStreamReader
,如上述代码所示