2006 年 3 月 15 日 20 時 41 分

文字コードの変換


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


では、文字コードの変換をしてみよう。

まずは、jcode.pl から。
これはモジュールではないため、
懐かしい require 文で取り込む。

require 'jcode.pl';

文字コードを調べるには、getcode を使う。

# 'jis' / 'sjis' / 'euc' / 'binary' / undef が返る。
my $encoding = jcode::getcode(\$data)

例えば、$data が EUC で符号化された文字列なら、
おそらく 'euc' が返るはずだ。
曖昧で判別できない場合は undef が返る可能性もある。

コードを変換する関数はいくつかあるが、
汎用なのが convert である。
これはスカラの文字コードを直接変換してくれる。
以下のようにすれば、$data が SHIFT JIS に変換される。

my $encoding = jcode::convert(\$data, 'sjis', 'euc');

戻り値は元の文字コードだ。失敗すると undef となる。
第 3 引数を省略した場合、文字コードを
自動判別してくれるので、getcode の手間が省ける。


次に、Jcode モジュール。互換性があるため、
jcode.pl と同じインタフェースで利用できる。

use Jcode;

# 'ascii' / 'ucs2' / 'utf8' も戻る可能性がある。
my $encoding = Jcode::getcode(\$data);

# ほぼ同じ。
my $encoding = Jcode::convert(\$data, 'sjis', 'euc');


次に、Encode モジュール。規模が大きいので独特だ。
文字コードを調べるには Guess というサブモジュールを使う。

use Encode::Guess;

# 絞込みをかけておかないと信頼性が落ちる。
@suspects = ('euc-jp', 'shift-jis', 'iso-2022-jp');

# 判別できた場合、戻り値はオブジェクトだ。
my $encoder = guess_encoding($data, @suspects);

ref($encoder) が偽を返した場合、判別不能となる。
コード名は、$encoder->name で取得できる。
jcode 系と違い、コード名には、IANA などの正式名を使う。

コードを変換する関数は、5.8 の文字列の特性を考えると、
from_to を使うのが好ましいと言える。

use Encode;
my $length = Encode::from_to($data, 'euc-jp', 'shift-jis');

戻り値はバイト数だ。変換に失敗した場合は undef を返す。
jcode 系との違いは、コードを指定する引数の順番と、
リファレンスを使わずにデータを渡すことだ。

Perl の場合、基本的に参照渡しなので、
リファレンスやグロブで渡さなくとも、
スカラ変数を書き換えることができるためだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.