ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-03-12

[][]decodeした場合とencodeした場合のlength関数の違い 14:26 decodeした場合とencodeした場合のlength関数の違い - ishiducaの日記 を含むブックマーク はてなブックマーク - decodeした場合とencodeした場合のlength関数の違い - ishiducaの日記 decodeした場合とencodeした場合のlength関数の違い - ishiducaの日記 のブックマークコメント

メモ

  • decodeした場合は、文字数でカウントする
  • encodeした場合は、オクテット(バイト?)でカウントする

「まるごとPerl」に載ってた。

以上 ...だけではなんなので

こんなので試してみた

$ perl -MEncode -wl -e 'print length decode("utf-8",$_) foreach( ("アイウエオ","アイウエオ","abcde") );'
# 結果
5
5
5

上はdecodeした場合(僕の環境だとデフォルトで utf-8 なので)、全部 5、つまり文字数で数えていることが分かります。次はencodeした場合

$ perl -MEncode -wl -e 'print length encode("utf-8",decode("utf-8",$_)) foreach( ("アイウエオ","アイウエオ","abcde") );'
15
15
5

utf-8 でエンコードした文字だと日本語5文字で15オクテットなので、1文字は 3オクテットということがわかります。これを EUC-JP で試してみる。

$ perl -MEncode -wl -e 'print length encode("EUC-JP",decode("utf-8",$_)) foreach( ("アイウエオ","アイウエオ","abcde") );'
10
10
5

EUC-JPだと日本語は 2オクテット。



追記 2009.03.15

foreachループの代わりに、mapでもいい(追記する必要はないんだけど、mapを使ってみたかったので追記する)

$ perl -MEncode -wl -e '$,="\n";print map{ length decode("utf-8",$_) }("アイウエオ","アイウエオ","abcde");'
トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090312