要するに、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()
andstrip()
– Why is String.strip() 5 times fast than String.trim() for blank string In Java 11