KotlinのString#trim()

流行りのKotlinと流行りのAndroid Architecture Componentsを使って、アプリ作って広告収入でガッポガッポや〜とか考えてたらどうでもいいところで詰まった。

String word = " hogehoge ";
System.out.println("'" + word.trim() + "'");  // => ' word '

みたいにJavaString#trim()だと全角スペースは削除されないが、Kotlinではそれも消される。

val word = " hogehoge "
println("'${word.trim()}'")  // => 'word'

公式のソースコードを読んでみると、内部的にはCharSequence#trim()を呼び出しており、その中でスペースの判定にはCharacter.isWhitespace()を利用している。JavaのCharacterクラスのisなんちゃらメソッドはだいたいUnicodeのコードポイントで判別しているため、Space Separatorカテゴリの全角スペースはtrim()メソッドで消されてしまう。

Javaはそういうのを考慮せず、u0020以下のものを削除するので、全角スペース(u3000)は削除されない。

trimでpredicateを渡したり、java.lang.Stringにキャストしたりするとできる。

val word = " hogehoge "
println(word.trim { it <= ' ' })  // predicateを渡してJavaと同じことをやる
println((word as java.lang.String).trim())  // 無理やりJavaのStringにキャスト

参考: