問題が存在します。しかし、0x0000
から0xFFFF
までの16ビット(2バイト)のUnicode文字ではありません。 Unicodeエンコーディングで2バイト以上必要な文字があります。これらの文字はUnicode code points
でJava Characterに記載されています。「U + 0000からU + 10FFFFの範囲の文字値にはUnicodeコードポイントが使用され、16ビットのchar値にはUnicodeコードユニットが使用されます。 UTF-16エンコーディング " Javaプラットフォームでは、char配列とStringクラスおよびStringBufferクラスでUTF-16表現が使用されます。この表現では、補足文字(コードポイントがU + FFFFより大きい文字)は、char値のペアとして表されます。最初のものは上位サロゲート範囲(\ uD800- \ uDBFF)から、サロゲート範囲(\ uDC00- \ uDFFF)。
問題はorg.apache.xmlbeans.impl.store.Saver
です。これはprivate char[] _buf
で動作します。しかし、char
の最大値は0xFFFF
なので、0x10000
から0x10FFFF
までのUnicodeコードポイントはchar
に格納することはできません。したがって、char値のペアとして格納されます。
はchar
が0x10000
と0x10FFFF
の間であれば、それはチェックするため、このコードは完全にバグがある方法
/**
* Test if a character is valid in xml character content. See
* http://www.w3.org/TR/REC-xml#NT-Char
*/
private boolean isBadChar (char ch)
{
return ! (
(ch >= 0x20 && ch <= 0xD7FF) ||
(ch >= 0xE000 && ch <= 0xFFFD) ||
(ch >= 0x10000 && ch <= 0x10FFFF) ||
(ch == 0x9) || (ch == 0xA) || (ch == 0xD)
);
}
があります。このように、これはまったく不可能です。
また、上位サロゲート範囲(\ uD800- \ uDBFF)と低いサロゲート範囲(\ uDC00- \ uDFFF)は無効な文字として除外されます。したがって、char値のペアとしてのコードポイント表現は除外されます。
この問題は、org.apache.xmlbeans.impl.store.Saver
というバグが原因です。
パッチ:
目標:悪い文字として、(\ uDC00- \ uDFFF)、高サロゲートを除外しないが(\ uD800- \ uDBFF)、範囲、および低サロゲートの範囲は。したがって、UnicodeコードポイントはU + 10000を超え、2つの16ビットとして格納されますchars
XML
では除外されません。
Saver.javaをダウンロードしてください。 private boolean isBadChar (char ch)
static final class OptimizedForSpeedSaver
とstatic final class TextSaver
両方で
/**
* Test if a character is valid in xml character content. See
* http://www.w3.org/TR/REC-xml#NT-Char
*/
private boolean isBadChar (char ch)
{
return ! (
(ch >= 0x20 && ch <= 0xFFFD) ||
(ch == 0x9) || (ch == 0xA) || (ch == 0xD)
);
}
に変更してください。
コンパイルSaver.java
。
xmlbeans-2.6.0.jar
のバックアップをクラスパスの外側に格納します。
Saver$OptimizedForSpeedSaver.class
とSaver$TextSaver.class
をxmlbeans-2.6.0.jar
- >/org/apache/xmlbeans/impl/store/
に置き換えると、新しいコンパイルされたものになります。
U + 10000を超えるUnicodeコードポイントは、sharedStrings.xml
に格納されます。
免責事項: これは、十分にテストされていません。したがって、これを生産的に使用しないでください。この問題を説明するのはここだけです。たぶんxmlbeans.apache.org
のプログラマーがorg.apache.xmlbeans.impl.store.Saver
で問題を解決する時間を見つけるでしょう。
更新 が利用可能になりましxmlbeans-2.6.2.jarがあります。これにはすでにパッチが含まれています。
これらの文字を書いているいくつかのコードを共有していただけますか? – Sanjeev
あなたの返事をありがとう。サンプルコードが追加されました。 – leonlai
Javaコンパイラが、それらの文字を含むソースファイルの読み込みに正しいエンコーディングを使用していることを確認しましたか? – Gagravarr