Кажется, что основная проблема заключается в том, что Transformer.transform()
будет поддерживать только «чистое» преобразование символов в базовой многоязычной плоскости (BMP), хотя в этой истории может быть что-то большее, чем это.Я клонировал код из вашей ссылки и создал входной XML-файл на основе вашего примера, содержащий несколько символов CJK:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<character>
<!-- Basic Multilingual Plane -->
<!-- CJK Unified Ideographs Extension A -->
<literal>U+3400 㐀</literal>
<literal>U+4DB5 䶵</literal>
<!-- CJK Unified Ideographs Extension -->
<literal>U+53F1 叱</literal>
<!-- Supplementary Ideographic Plane -->
<!-- CJK Unified Ideographs Extension B -->
<literal>U+20000 ?</literal>
<literal>U+20B9F ?</literal>
<literal>U+2A6D6 ?</literal>
<!-- CJK Unified Ideographs Extension C ? -->
<literal>U+2A700 ?</literal>
<literal>U+2B734 ?</literal>
<!-- CJK Unified Ideographs Extension D -->
<literal>U+2B740 ?</literal>
<literal>U+2B81D ?</literal>
</character>
Когда я запустил приложение (используя JDK 11) три символа CJK, которые были в BMPбыли преобразованы правильно, но все они в дополнительной идеографической плоскости (SIP) были преобразованы в escape-коды HTML.Вот XML-файл, который был создан:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<character>
<!-- Basic Multilingual Plane -->
<!-- CJK Unified Ideographs Extension A -->
<literal>U+3400 㐀</literal>
<literal>U+4DB5 䶵</literal>
<!-- CJK Unified Ideographs Extension -->
<literal>U+53F1 叱</literal>
<!-- Supplementary Ideographic Plane -->
<!-- CJK Unified Ideographs Extension B -->
<literal>U+20000 𠀀</literal>
<literal>U+20B9F 𠮟</literal>
<literal>U+2A6D6 𪛖</literal>
<!-- CJK Unified Ideographs Extension C ? -->
<literal>U+2A700 𪜀</literal>
<literal>U+2B734 𫜴</literal>
<!-- CJK Unified Ideographs Extension D -->
<literal>U+2B740 𫝀</literal>
<literal>U+2B81D 𫠝</literal>
</character>
Когда я запускаю код в отладчике, кажется, что JRE использует Xalan для реализации Transformer.transform()
.Существует очень старая публикация SO Сериализация дополнительных символов Unicode в XML-документы с Java , которая не является дубликатом вашей проблемы, но связана с ней.Автор даже поднял отчет об ошибке Xalan для проблемы ToXMLStream не поддерживает дополнительные символы Юникода в 2012 году, которые все еще открыты!
Символ ?
(U + 20B9F), который вы упомянулив вашем комментарии это SIP, по-видимому, поэтому он был преобразован в escape-код, тогда как очень похожий символ 叱
(U + 53F1) находится в BMP и преобразован правильно.
Я не знаюНе знаю, почему существует эта проблема, но есть несколько возможных причин:
- Реализация Xalan
Transformer.transform()
поддерживает только символы в BMP. - Реализация Xalan
Transformer.transform()
не делаетподдерживает преобразование четырехбайтовых символов Unicode. - Xalan не был обновлен для поддержки символов CJK, указанных в более поздних расширениях CJK Unified Ideographs.
- Для преобразования было принято намеренное решение о разработкеSIP символы таким образом.Это может показаться маловероятным, за исключением того, что:
- Экранирующие коды HTML всегда правильны
- SIP-символы правильно преобразуются в комментариях.