Perl/日本語処理
Perl > 日本語処理
この項目では、Perlにおける日本語(マルチバイト文字)処理について説明する。
utf8プラグマとutf8フラグ[編集]
utf8プラグマを使用すると、ソースコードがUTF-8であると仮定され、文字列にutf8フラグが立つようになる。また様々な関数や演算子はバイト単位ではなく文字単位で動作するようになる。
use utf8;
例えば、lengthは文字数を返すようになる。
use bytes;
print length "あいうえお"; # UTF-8でエンコードされている場合は15
use utf8;
print length "あいうえお"; # 5
ファイルハンドルへの出力時にutf8フラグを落とすには、Perl5.8以降では2引数のbinmode()を用いる。
binmode STDOUT, ':utf8';
もしくはEncodeモジュールのencode_utf8()関数を用いる。
use Encode qw(encode_utf8);
print encode_utf8("あいうえお");
utf8フラグが付いたまま出力すると、warningsプラグマや-wスイッチが有効な場合、次のような警告が発せられる。
Wide character in print at -e line 1.
UTF2ソフトウェア[編集]
UTF-2 は UTF-8 の旧称である。UCS-2と間違いやすいが、UCS-2は2バイト固定長なのに対してUTF-2は1バイトから4バイトの可変長であり、別物である。use UTF2
を使用すると、やはりソースコードがUTF-8であると仮定される。また様々な関数や演算子はバイト単位ではなく文字単位で動作するようになるが、文字列の長さや文字列中の文字の位置はバイト単位で扱うため、いままでのスクリプトとこれからのスクリプトは互換性が確保される。
なお、文字単位で扱う関数は UTF2::* という名前で提供されている。例えば、文字列の長さを文字単位で知りたい(文字数を知りたい)場合は UTF2::length を使用する。
use UTF2;
length は以下のように機能する。
print length "あいうえお"; # UTF-8でエンコードされている場合は15
print UTF2::length "あいうえお"; # 5
UTF2ソフトウェアは以下の利点がある。
- utf8フラグに煩わされることなくプログラミングすることができる
- 過去のスクリプトを利用することができる
一方、欠点として以下の点がある。
- utf8フラグがないために Latin-1 を扱うことができない
Sjisソフトウェア[編集]
UTF2ソフトウェアと同じコンセプトで作成されたシフトJIS版のソフトウェアである。JPerl向けに書かれたスクリプトを使用する際に便利である。
use Sjis;
文字列の長さを求めたい場合は以下のように機能する。
print length "あいうえお"; # シフトJISでは10(単位はバイト)
print Sjis::length "あいうえお"; # 5(単位は文字)
文字エンコーディング[編集]
文字エンコーディングの操作には、Perl4ではjcode.pl、Perl5.8以前はJcode.pm、Perl5.8以降はEncode.pmを用いる。 なお、Perl4以降のどのバージョンでも共通でjacode.plを用いることができる。これはjcode.plのインタフェースで UTF-8およびEncode.pmの機能を利用することができるのでスクリプトの互換性を確保するのに重宝する。例えば Shift_JISをUTF-8に変換するには、
require 'jacode.pl';
$str = 'あいうえお';
&jcode'convert(*str, 'utf8', 'sjis');
とする。
(jacode.plがない場合)Perl5.8以降でShift_JISをUTF-8に変換するには、Encodeのfrom_to関数を使って、
use Encode qw(from_to);
my $str = 'あいうえお';
from_to $str, 'Shift_JIS', 'UTF-8';
とする。