1. ホーム
  2. java

[解決済み] Java文字列のユニコードコードポイントを繰り返し処理するにはどうすればよいですか?

2022-10-17 16:53:40

質問

ということは、私は String#codePointAt(int) でインデックス化されていますが char のオフセットでインデックス化され、コードポイントのオフセットではありません。

みたいなのをやってみようかなと思っています。

  • を使って String#charAt(int) を取得するために char をインデックスで取得します。
  • をテストしています。 char 高サロゲート範囲
    • であれば String#codePointAt(int) を使用してコードポイントを取得し、インデックスを 2 つ増やします。
    • でない場合は、与えられた char の値をコードポイントとして使用し、インデックスを 1 つインクリメントします。

しかし、私の懸念は

  • 当然ながら高サロゲート範囲にあるコードポイントが、2つの char 値として格納されるのか、それとも 1 つの
  • これは、文字を反復処理するための非常に高価な方法のように思えます。
  • 誰かがもっと良いものを考え出したに違いない。

どのように解決するのですか?

はい、Java は文字列の内部表現に UTF-16 風のエンコーディングを使用します。また、基本多言語面 ( BMP ) の外側の文字をサロガシー方式でエンコードします。

BMP以外の文字を扱うことが分かっている場合、Java Stringの文字を反復処理する標準的な方法を紹介します。

final int length = s.length();
for (int offset = 0; offset < length; ) {
   final int codepoint = s.codePointAt(offset);

   // do something with the codepoint

   offset += Character.charCount(codepoint);
}