category: Java
DATE : 2006/05/09 (Tue)
DATE : 2006/05/09 (Tue)
Java SE 5 以前では、文字列の文字数を数えるために java.lang.String#length() を使っていました。
Java で文字を表す char 型は2バイト幅です。また、文字は UTF-16 として表現されています。上記 length メソッドの javadoc にもあるように、java.langString#length() は純粋に char 型の値の数を求めます。
しかし、 Java SE 5 から、 Unicode 4.0 がサポートされました。Unicode 4.0 では、UTF-32 という文字エンコーディングが制定されました。つまり、Unicode 4.0 では、4バイト幅の文字コードも存在することになります。4バイト幅の文字コードを UTF-16 で表現する場合は、上位2バイトと下位2バイトを別々にして表現します(従来の2バイト幅や1バイト幅の文字コードはそのままです)。
すると、4バイト幅の文字コードは、char 型のデータとしては2つ必要になります。2つの char データで1文字を表すことになるわけです。
そうなると、java.lang.String#length() の結果が狂ってしまいます。純粋に char 型のデータの数を返すので、4バイト幅の文字が1文字からなる文字列では「2」という結果が返ってきます。
そこで、Java SE 5では java.lang.String#codePointCount(int, int) が追加されました。今後、文字数を数える際にはこらちのメソッドを使うとよいかもしれません。
ちなみに、文字列全体の文字数を求めるコードは以下のようになります。
(s は java.io.String の変数)
int length = s.codePointCount(0, s.length());
参考文献
PR
忍者ブログ [PR]