Java 11 における String trim() と strip() メソッドの違い

要するに、strip()trim() の “Unicode-aware” 版です。

CSR : JDK-8200378

問題

String::trim は Java の初期から存在し、まだ完全に進化していなかった Unicode が今日広く使用する規格となりました。

String::trim で使用されるスペースの定義は、スペース コードポイント (\u0020) 以下の任意のコードポイントで、一般に ASCII または ISO 制御文字と呼ばれます。

Unicode 対応のトリミング ルーチンでは Character::isWhitespace(int) を使用すべきです。

解決策

Unicode のホワイトスペースを認識し、先行のみまたは後続のみの追加制御を提供するトリミング メソッドを導入します。 バグ JDK-8200373.

現在の String::trim の JavaDoc では、コード内で使用されている “スペース” の定義が明確でありません。 近い将来、スペースの異なる定義を使用する追加のトリミング方法が登場するため、明確化が必須となります。 String::trim は、スペース文字のコードポイント (\u0020) 以下の任意のコードポイントとしてスペースの定義を使用します。新しいトリミングメソッドは、Character::isWhitespace 述語に渡されると true を返す任意のコードポイントとして (white) スペースの定義を使用する予定です。

メソッド isWhitespace(char) は JDK 1.1 で Character に追加されましたが、メソッド isWhitespace(int) は JDK 1.5 まで Character クラスに導入されませんでした。 後者のメソッド(int型のパラメータを受け取るもの)は、補助文字をサポートするために追加されたものである。 Character クラスの Javadoc コメントでは、補足文字(通常は int ベースの “コード ポイント” でモデル化)と BMP 文字(通常は 1 文字でモデル化)を定義しています:

U+0000 から U+FFFF までの文字のセットは、基本多言語面 (BMP) と呼ばれることがあります。 コードポイントがU+FFFFより大きい文字を補助文字と呼びます。 Javaプラットフォームでは、文字配列やStringクラス、StringBufferクラスでUTF-16表現が使われています。 この表現では、補助文字は、char 値の組として表現されます … したがって、char 値は、代用符号点を含む基本多言語面(BMP)符号点、すなわち UTF-16 エンコーディングの符号単位を表します。 int 値は、補助コードポイントを含むすべての Unicode コードポイントを表します。 … char 値しか受け付けないメソッドは、補助文字をサポートできません。 … int 値を受け入れるメソッドは、補足文字を含むすべての Unicode 文字をサポートします。

OpenJDK Changeset.

Benchmark comparison between trim() and strip() – Why is String.strip() 5 times fast than String.trim() for blank string In Java 11

コメントを残す

メールアドレスが公開されることはありません。