Конвертировать UTF-8 в ISO-8859-1 с помощью Numeri c Символьный справочник - PullRequest
0 голосов
/ 14 апреля 2020

Я получаю xml от третьей стороны с кодировкой UTF-8, и мне нужно отправить ее другой третьей стороне, но с кодировкой ISO-8859-1. В xml есть много разных языков, например русский в кириллице c. Я знаю, что технически невозможно напрямую преобразовать UTF-8 в ISO-8859-1, однако я нашел StringEscapeUtils.escapeXML(), но при использовании этого метода все xml преобразуется даже <, > и так далее, и я бы только преобразовать кириллицу c в номерную ссылку. Существует ли такой метод в Java или он всегда анализирует целое xml? Есть ли еще одна возможность разбирать только символы, которые не могут быть закодированы в ISO-8859-1, для ссылки на числовой формат?

Я видел похожие вопросы по SO, такие как: Как мне конвертировать между ISO-8859 -1 и UTF-8 в Java? , но это без упоминания ссылки на числовой формат

1 Ответ

1 голос
/ 14 апреля 2020

ОБНОВЛЕНИЕ: Удалена ненужная загрузка DOM.

Используйте трансформатор XML. Он умеет XML экранировать символы, которые не поддерживаются данной кодировкой.

Пример

Transformer transformer = TransformerFactory.newInstance().newTransformer();

// Convert XML file to UTF-8 encoding
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new StreamSource(new File("test.xml")),
                      new StreamResult(new File("test-utf8.xml")));

// Convert XML file to ISO-8859-1 encoding
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
transformer.transform(new StreamSource(new File("test.xml")),
                      new StreamResult(new File("test-8859-1.xml")));

test. xml (вход , UTF-8)

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <english>Hello World</english>
  <portuguese>Olá Mundo</portuguese>
  <czech>Ahoj světe</czech>
  <russian>Привет мир</russian>
  <chinese>你好,世界</chinese>
  <emoji>? ?</emoji>
</test>

Перевод https://translate.google.com (кроме эмодзи)

test-utf8 . xml (выход, UTF-8)

<?xml version="1.0" encoding="UTF-8"?><test>
  <english>Hello World</english>
  <portuguese>Olá Mundo</portuguese>
  <czech>Ahoj světe</czech>
  <russian>Привет мир</russian>
  <chinese>你好,世界</chinese>
  <emoji>&#128075; &#127758;</emoji>
</test>

test-8859-1. xml (выход, ISO-8859-1)

<?xml version="1.0" encoding="ISO-8859-1"?><test>
  <english>Hello World</english>
  <portuguese>Olá Mundo</portuguese>
  <czech>Ahoj sv&#283;te</czech>
  <russian>&#1055;&#1088;&#1080;&#1074;&#1077;&#1090; &#1084;&#1080;&#1088;</russian>
  <chinese>&#20320;&#22909;&#65292;&#19990;&#30028;</chinese>
  <emoji>&#128075; &#127758;</emoji>
</test>

Если вы замените test.xml на файл test-8859-1.xml (копировать / вставить / переименовать), вы все равно получите те же выходные данные, так как синтаксический анализатор автоматически определяет кодировку и удаляет все экранированные символы.

...