LLでのマルチバイト文字の文字数の取得
以下のような方法でそれぞれ文字数を求めると、日本語文字列の文字数がうまく取得できません。
Ruby
"English".length #7文字 "日本語".length #6文字になる
Python
len("English") #7文字 len("日本語") #6文字になる
PHP
strlen("English"); //7文字 strlen("日本語"); //6文字になる
上記のようになるのは、RubyやPythonやPHPでは文字列をバイト列で扱っているためです。
それぞれ、以下のように書くことでマルチバイト文字でも文字数を取得することができます。
Ruby
"日本語".split(//s).length #3文字で正しい
Python
len(u"日本語") #3文字で正しい
PHP
PHPは拡張モジュールのmbstringが必要です。
mb_strlen("日本語"); //3文字で正しい
先頭100文字を表示したりするといった処理の時などに、思わぬバグの原因になったりするかもですので注意が必要ですね。
スクリプト言語なら、このあたりは意識しなくても書けるといいのですけどねえ。
追記:
コメントでご指摘がありました。
rubyにはjcodeという日本語を扱うことを意識したStringクラスのメソッドを追加、再定義したものがあるそうです。
require 'jcode' $KCODE='s' "日本語".jsize #3文字で正しい。
ちなみにバージョンについての情報を書いていなかったのですが、Rubyは1.8.6、Pythonは2.5.1、PHPは5.2.4です。