正しい用語を使用していないか、ここで多くの混乱が生じています。
文字参照表記は&#x
数値コードポイントを指定するだけです。リーダーやパーサーが使用する Unicode のバージョンとは無関係です。
コードは、文字の数値が 2 16未満であると想定しているため、実際には Unicode 1.x とのみ互換性があります。Unicode 2.0 の時点では、これは正しい仮定ではありません。一部の文字は単一の Javachar
で表されますが、他の文字は 2 つの Java で表されます(サロゲートchar
と呼ばれます)。
「UTF-8リーダー」が何であるかわかりません。Readerは値を読み取るだけで、UTF-8 エンコーディング (または特定の CharsetDecoder が使用するエンコーディング) を使用してバイトを文字に変換するためにCharsetDecoderを使用するInputStreamReaderchar
を除いて、UTF-8 またはその他の文字セットについては知りません。
いずれにせよ、Reader は XML&#x
文字参照表記を解析しません。そのためには、XML パーサーを使用する必要があります。
Reader または XML パーサーは、Java が認識している Unicode バージョンの影響を受けません。これは、どのような方法でも、Unicode データベースを参照する Reader または XML パーサーがないためです。文字は解析時に数値として扱われます。それらが任意の Unicode バージョンで割り当てられたコードポイントに対応するかどうかは考慮されません。
最後に、 String を XML として書き出すには、Formatterを使用できます。
static String toXML(String s) {
Formatter formatter = new Formatter();
int len = s.length();
for (int i = 0; i < len; i = s.offsetByCodePoints(i, 1)) {
int c = s.codePointAt(i);
if (c < 32 || c > 126 || c == '&' || c == '<' || c == '>') {
formatter.format("&#x%x;", c);
} else {
formatter.format("%c", c);
}
}
return formatter.toString();
}
ご覧のとおり、文字は単なる数値であるため、Unicode バージョンに依存するコードはありません。各数値が割り当てられた Unicode コードポイントであるかどうかは関係ありません。
(私の最初の傾向は XMLStreamWriter クラスを使用することでしたが、Java 1.8 の時点で、ISO-8859-1 や US-ASCII などの非 Unicode エンコーディングを使用する XMLStreamWriter は、サロゲート ペアを単一文字エンティティとして適切に出力しないことが判明しました。 .0_05.)