【问题标题】:XML encoding UTF-8 not working for turkish charactersXML 编码 UTF-8 不适用于土耳其语字符
【发布时间】:2014-10-22 06:49:10
【问题描述】:

我有一种方法可以创建并记录到 xml 文件。它会产生损坏的结果。我的土耳其语字符写成十六进制表达式。当我使用 UTF-8 时,我无法解决问题。顺便说一句,我使用 Sublime 和 Notepad++ 编辑器进行了检查。

public boolean add(BatFile batFile) throws Exception {
        File inputFile = new File(fileLocation);
        DocumentBuilderFactory docFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(inputFile);

        Element rootElement = doc.getDocumentElement();

        Element batFileElement = doc.createElement("BatFile");
        rootElement.appendChild(batFileElement);

        Element batJobName = doc.createElement("Name");
        batJobName.appendChild(doc.createTextNode(batFile.getName()));
        batFileElement.appendChild(batJobName);

        Element batFileBriefDesc = doc.createElement("BriefDesc");
        batFileBriefDesc
                .appendChild(doc.createTextNode(batFile.getBriefDesc()));
        batFileElement.appendChild(batFileBriefDesc);

        Element batFileDesc = doc.createElement("Desc");
        batFileDesc.appendChild(doc.createTextNode(batFile.getDesc()));
        batFileElement.appendChild(batFileDesc);

        Element batFileName = doc.createElement("FileName");
        batFileName.appendChild(doc.createTextNode(batFile.getFileName()));
        batFileElement.appendChild(batFileName);

        Element batCommandArgs = doc.createElement("CommandArgs");

        for (int k = 0; k < batFile.getCommandArgs().size(); k++) {
            Element commandArg = doc.createElement("CommandArg");
            // commandArg.setAttribute("ID", String.valueOf(k));
            commandArg.appendChild(doc.createTextNode(batFile.getCommandArgs()
                    .get(k)));
            batCommandArgs.appendChild(commandArg);

        }
        batFileElement.appendChild(batCommandArgs);

        Element batCreationTime = doc.createElement("CreationTime");
        batCreationTime.appendChild(doc.createTextNode(batFile
                .getCreationTime()));
        batFileElement.appendChild(batCreationTime);

        Element batSchedulerPattern = doc.createElement("SchedulerPattern");
        batSchedulerPattern.appendChild(doc.createTextNode(batFile
                .getExecutionPattern()));
        batFileElement.appendChild(batSchedulerPattern);

        Element batTaskID = doc.createElement("TaskID");
        if (batFile.getTaskID() != null) {
            batTaskID.appendChild(doc.createTextNode(batFile.getTaskID()));
        }
        batFileElement.appendChild(batTaskID);

        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer();
        DOMSource domSource = new DOMSource(doc);
        StreamResult result = new StreamResult(new FileWriter(inputFile));
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.transform(domSource, result);
        return true;

    }

当我用下面的代码测试它时:

    @Test
    public void testAddingTask() throws Exception {
        IBAO testBao = XMLBAO.getInstance();
        BatFile testBatFile = new BatFile();
        testBatFile.setName("ŞŞŞŞŞ");
        testBatFile.setBriefDesc("ÇÇÇÇÇÇ");
        testBatFile.setDesc("ĞĞĞĞĞĞ");
        testBatFile.setFileName("FileName");
        testBatFile.setCreationTime("Merhaba");
        testBatFile.setExecutionPattern("ööçöçöçüü");
        testBatFile.addCommandArgs("ZZZZZZZZ");
        testBatFile.setTaskID("ÜÜÜÜÜÜÜÜ");
        testBao.add(testBatFile);
    }

它给我带来了这样的结果:

<BatFiles>  
<BatFile>
<Name>???/Name>
<BriefDesc>???</BriefDesc>
<Desc>???</Desc>
<FileName>FileName</FileName>
<CommandArgs>
<CommandArg>ZZZZZZZZ</CommandArg>
</CommandArgs>
<CreationTime>Merhaba</CreationTime>
<SchedulerPattern>??????</SchedulerPattern>
<TaskID>????</TaskID>
</BatFile>
</BatFiles>

【问题讨论】:

    标签: java xml encoding utf-8


    【解决方案1】:

    您正在写入字符流,而不是让 API 控制数据写入的编码方式。 FileWriter 使用可能不是 UTF-8 的默认平台编码:

    该类的构造函数假定默认字符编码和默认字节缓冲区大小是可以接受的。

    FileOutputStreamStreamResult 一起使用(在try-with-resources 块中。)


    您也可能因Java source file encodings 而遇到问题。考虑使用 Unicode 转义而不是文字。也就是说,"\u015E" 而不是 "Ş"

    【讨论】:

    • 使用 FileOutputStream 解决了我的问题。但我想创建语义 XML 文件。使用 \u015e 代替 ş 是不可接受的。但顺便说一句,你给了我一个先机。
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多