文字数を調べる
Perl/CGIプログラム を使って文字数を調べる方法を紹介します。
通常Perl/CGIプログラムで文字を数える場合、length関数を使います。
しかし、日本語などの全角文字が含まれている場合は一工夫必要です。
なぜならlength関数というのは、1文字1バイトという前提条件の下に作られた関数だからです。
1文字1バイトが成立しているのは、半角英数、半角記号それとShiftJisコードの半角カタカナぐらいです。
残りの全角文字群や半角カタカナは、EUCコードであれば2バイト、UTF-8コードにおいては3バイトになっています。
ShiftJisコード、EUCコード、UTF-8コードそれぞれの文字を 16進数に変換 してみるとよくわかります。
以前 Perl/CGIプログラミング学習 でも説明しました。
では、日本語や全角文字が含まれている文字列の文字数を調べるにはどうすればよいかというと…。
Encodeモジュールを使います。
Encode.pmを使って文字列をデコードすると、簡単に文字数をカウントできます。
ShiftJisコードの場合
Perl/CGIプログラムでShiftJisコードの文字を数えてみましょう。
#!/usr/bin/perl
use strict;
use Encode;
my $string = 'Perl/CGI入門';
my $character = length(decode('sjis', $string));
my $byte = length($string);
print "Content-type: text/html; charset=shift_jis\n\n";
print "ShiftJisコードの文字列\"$string\"は $character 文字で $byte バイトです。";
exit;
アクセスすると「ShiftJisコードの文字列"Perl/CGI入門"は 10 文字で 12 バイトです。」と表示されます。
10文字というのは数えればわかることなので問題ないですよね。
12バイトになっているのは、文字列「Perl/CGI」は8バイト(1文字1バイト)で、「入門」は4バイト(1文字2バイト)だからです。
EUCコードの場合
Perl/CGIプログラムでEUCコードの文字を数えてみましょう。
#!/usr/bin/perl
use strict;
use Encode;
my $string = 'Perl/CGI入門';
my $character = length(decode('euc-jp', $string));
my $byte = length($string);
print "Content-type: text/html; charset=euc-jp\n\n";
print "EUCコードの文字列\"$string\"は $character 文字で $byte バイトです。";
exit;
アクセスすると「EUCコードの文字列"Perl/CGI入門"は 10 文字で 12 バイトです。」と表示されます。
バイト数の内訳はShiftJisコードと同じです。
UTF-8コードの場合
Perl/CGIプログラムでUTF-8コードの文字を数えてみましょう。
#!/usr/bin/perl
use strict;
use Encode;
my $string = 'Perl/CGI入門';
my $character = length(decode('utf-8', $string));
my $byte = length($string);
print "Content-type: text/html; charset=utf-8\n\n";
print "UTF-8コードの文字列\"$string\"は $character 文字で $byte バイトです。";
exit;
アクセスすると「UTF-8コードの文字列"Perl/CGI入門"は 10 文字で 14 バイトです。」と表示されます。
UTF-8コードでは、文字列「入門」は6バイト(1文字3バイト)になります。
そのほかの文字列「Perl/CGI」は1文字1バイトで同じです。