Преобразование XML не работает UTF-8 XMLOutputter Java - PullRequest
0 голосов
/ 28 февраля 2019

Я уже видел другие вопросы об этой же проблеме, но все равно получаю сообщение об ошибке.Hier - это небольшая часть кода, где я пытаюсь изменить exosting xml-файлы.Но он изменяет некоторые символы в тексте.

import org.jdom2.Document;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.io.FileOutputStream;
import java.io.IOException;

public class ModyfyXml {

public static void main(String[] args) throws JDOMException, IOException {

    try {

        SAXBuilder sax = new SAXBuilder();
        Document doc = sax.build("F:\\c\\test.xml");

        XMLOutputter xmlOutput = new XMLOutputter();
        Format format = Format.getPrettyFormat();
        format.setEncoding("UTF-8");
        xmlOutput.setFormat(format);
        xmlOutput.output(doc, (new FileOutputStream("F:\\c\\test2.xml")));

    }catch (IOException io) {
        io.printStackTrace();
    } catch (JDOMException e) {
        e.printStackTrace();
    }
}}

Здесь небольшой xml-файл, который я пытаюсь изменить (в данном случае просто скопируйте)

<?xml version="1.0" encoding="utf-8"?><page>
 䕶法喇嘛所居此處?仲無妻室亦降神附體
</page> 

После запуска программы я получаю следующее:

<?xml version="1.0" encoding="UTF-8"?>
<page>䕶法喇嘛所居此處&#x21e01;仲無妻室亦降神附體</page>

Некоторые символы китайского языка не могут быть правильно преобразованы

1 Ответ

0 голосов
/ 28 февраля 2019

Черт Я никогда не замечал эту ошибку в JDOM 2.

У вас будут те же результаты с любым не-BMP символом.Вы можете попробовать использовать смайлики мании последних лет и увидеть, что вы получите те же результаты.

Это происходит из-за того, что стратегия побега автоматически устанавливается для кодировки UTF, независимо от кодировки.То, что он делает, является довольно неправильным.

Это будет исправлено, если вы замените стратегию на стратегию, которая ничего не выходит за пределы зарезервированных символов XML:

format.setEscapeStrategy((c) -> false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...