Utf8Flag関数

「#--Utf8Flag」で検索すると確実にヒットします。

この関数は、指定した文字列に対してUtf8フラグを立てたり解除したりします。

第1引数に文字列、第2引数にコマンドを指定すると、実行結果の文字列が返ってきます。

Utf8フラグを立てるときは「ON」、解除するときは「OFF」を指定します。

半角文字であれば大文字小文字は区別されません。

省略した場合はUtf8フラグを立てます。

Utf8フラグを立てる場合も解除する場合も、すでに対象が処理済だった場合はそのままの値が帰ります。

Utf8フラグとはものすごく簡単に言うと、Perl側が1文字ずつ処理できるようにするためのマーキングのことです。

例えば以下のような場合…。

#!/usr/bin/perl

use strict;

my $char = "\xE3\x81\x82";
my $on = &Utf8Flag($char, 'on');
my $off = &Utf8Flag($char, 'off');

print "Content-type: text/html\n\n";
print "Char : ", length($char), "<br>\n";
print "ON : ", length($on), "<br>\n";
print "OFF : ", length($off), "<br>\n";

sub Utf8Flag {
my $string = shift or return;
my $flag = shift;

if (($flag eq '') or ($flag =~ /^on$/i)) {
unless (utf8::is_utf8($string)?1:0) {utf8::decode($string);}
} elsif ($flag =~ /^off$/i) {
if (utf8::is_utf8($string)?1:0) {utf8::encode($string);}
}

return $string;
}
exit;

ONは1、OFFは3になります。

ちなみに「$char」に代入されているのはUTF-8コードの「あ」の16進コードです。

16進コード変換ツールで確認できます。

Shift_jisコードの半角カタカナ以外の日本語文字はすべて1文字であっても複数のバイト数を必要とします。

上記の例では、1文字なのに3バイトかかってしまうというのがポイントです。

Utf8フラグを立てて文字単位で計算させた場合、lengthを使った場合には1文字なので1となり…。

Utf8フラグを解除してバイト数で計算させた場合、lengthを使った場合には3バイトかかっているので3となるわけです。

これは、Perlプログラム中で日本語という特殊な文字を扱うための考え方です。

英語のみの場合、半角英数であれば1文字1バイトなので、Utf8フラグという考え方は必要ありません。