1

解析できないフィードプロバイダーの1つから、XMLでユニコード文字を含む以下の文字列を取得しています。また、これらの文字の16進コードを取得してから、\ uを付加しようとしましたが、これも機能しませんでした。

String str = "</fullText" + ">";
StringBuilder strb = new StringBuilder();
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
  char c = chars[i];
  if ( c >= Character.MIN_HIGH_SURROGATE && c <= Character.MAX_HIGH_SURROGATE ) {
    char ch2 = chars[i+1];
  } else
    strb.append(c);
}
System.out.println(strb.toString());

これは理想的にはそれらの文字をスキップするはずですが、そうではありません。文字列内のこれらの文字を削除したいと思います。

誰かが同様の問題に直面しましたか?この点での助けは大歓迎です。

Vaibhav

4

1 に答える 1

1

コードは、高いサロゲートコードポイントのみをスキップしているようです。次の低いサロゲートもスキップするための最も簡単な変更は、行を変更することです

        char ch2 = chars[i+1]; 

        i++;

ただし、これはより堅牢であり、次のようにループを記述するためにコードを読みやすくします。

 for (int i = 0; i < chars.length; i++) {
     char c = chars[i];
     Character.UnicodeBlock block = Character.UnicodeBlock.of(c);
     if(block != Character.UnicodeBlock.HIGH_SURROGATES && 
        block != Character.UnicodeBlock.LOW_SURROGATES) {
           strb.append(c);
     }
 }

これは、孤立した高サロゲートまたは低サロゲート、または高サロゲートと低サロゲートを間違った順序で含む不正な形式のデータも処理します(つまり、有効なサロゲートペアを受け入れ可能な文字として処理した場合でも、スキップまたはエラー処理する必要があるデータを意味します)。

于 2012-09-14T08:41:47.363 に答える