XML编码UTF-8不适用于土耳其语字符

时间:2014-10-22 06:49:11

标签: java xml encoding utf-8

我有一个创建和记录到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>

1 个答案:

答案 0 :(得分:1)

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

  

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

使用FileOutputStream StreamResult (在try-with-resources区块中。)


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