Javaで文字列の長さを正しく計算するにはどうすればいいですか? 質問する

Javaで文字列の長さを正しく計算するにはどうすればいいですか? 質問する

コード ユニット/コード ポイントに対して多かれ少なかれ機能するString#lengthさまざまな方法があることは知っています。Character

JavaでUnicode標準で指定された結果を実際に返すための推奨方法は何ですか(UAX#29)、言語/ロケール、正規化、書記素クラスターなどを考慮して、どのように変換しますか?

ベストアンサー1

Javaの文字列長の標準モデル

String.length()指定されたchar文字列内の値(「コード単位」)の数を返すのと同じです。最も一般的に役立つJava 文字列の長さの定義については以下を参照してください。

配列/配列スライスのサイズに基づくのセマンティクスの説明1は間違っています。lengthlength()また配列または配列スライスのサイズは単に典型的な Java クラス ライブラリの実装の詳細。Stringそのように実装する必要はありません。実際、そのように実装されていない Java String 実装を見たことがあると思います。


文字列の長さの代替モデル。

文字列内のUnicodeコードポイントの数を取得するにはstr.codePointCount(0, str.length())、以下を参照してください。javadoc の

特定のエンコーディング(つまり文字セット)の文字列のサイズ(バイト単位)を取得するには、str.getBytes(charset).length2 を使用します。

ロケール固有の問題に対処するには、Normalizer文字列をユースケースに最も適した形式に正規化し、codePointCount上記のように使用します。ただし、場合によってはこれでも機能しないことがあります。たとえば、Unicode 標準では明らかに対応していないハンガリーの文字カウント規則などです。


String.length() の使用は一般的には問題ありません

ほとんどのアプリケーションが を使用する理由は、String.length()ほとんどのアプリケーションが、人間中心の方法で単語やテキストなどの文字数をカウントすることに関心がないからです。たとえば、次のようにします。

String s = "hi mum how are you";
int pos = s.indexOf("mum");
String textAfterMum = s.substring(pos + "mum".length());

コード ポイントを返さないことや、言語的に正しい文字数ではないことは、実際には問題ではありません"mum".length()。手元のタスクに適したモデルを使用して文字列の長さを測定しています。そして、それは機能します。

当然、多言語テキスト分析 (単語の検索など) を行うと、状況は少し複雑になります。しかし、その場合でも、開始前にテキストとパラメータを正規化しておけば、ほとんどの場合、「コード ポイント」ではなく「コード ユニット」で安全にコーディングできます。つまり、length()依然として機能します。


1 - この説明は質問のいくつかのバージョンにありました。編集履歴を参照してください...十分なrepポイントがある場合は。2
- 使用するにはstr.getBytes(charset).length、エンコードしてそれを破棄する必要があります。一般的なコピーなしでこれを行う方法はありません。 をStringとしてラップしCharBuffer、バイトカウンタとして機能するバックアップのないカスタムを作成しByteBuffer、 を使用してEncoder.encode(...)バイトをカウントする必要があります。注: これは試したことがなく、試すことはお勧めしません。ない限りgetBytes(charset)重大なパフォーマンスのボトルネックとなっているという明確な証拠があります。

おすすめ記事