忍者ブログ
[54] [53] [52] [51] [50] [49] [48] [47] [46] [45] [44]

DATE : 2017/07/24 (Mon)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


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
●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
★無題
NAME: MT
(゚∀゚)アヒャ
(゚∀゚)アヒャ
(゚∀゚)アヒャ
(゚∀゚)アヒャ
(・∀・)アヒャ
(゚∀゚)アヒャ
2006/05/10(Wed)13:37:32 編集
●この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
06 2017/07 08
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)
ブログ内検索
最近の状況
リンク
カレンダー
06 2017/07 08
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
T/O
(11/05)