Perl の文字コード取り扱い周りのメモ

(2010/11/19 追記)後半が切れてしまっていたのを修正

perl の 5.8 以降では内部用のテキスト文字列とバイト文字列が区分けされている。テキスト文字列は文字集合 Unicode で形成されている。バイト文字列は内部用のテキスト文字列以外の文字列を示す。

テキスト文字列は Perl が内部で文字を扱うためのエンコーディングとして作用する。他のエンコーディングに変換するための中間形式としてとらえても良い。 Perl では、ソースコード上の文字列は全てこのテキスト文字列として取り扱う。

(自分の理解では)従って、テキスト文字列でない文字列は、Perlから見れば連続したバイトの並びにしか見えない。length を使ってもバイト数が返るだけで、文字数は計れない。バイト文字列を本来の意味での文字列として扱いたい場合、テキスト文字列にデコードしなければならない。これは Encode モジュールによって行う。

  # UTF-8 の文字列をテキスト文字列に変換する
  $text_strings = decode("UTF-8", $byte_strings);

  # テキスト文字列をバイト文字列に変換する
  $bytes_strings = encode("UTF-8", $text_strings);

尚、内部文字エンコーディング明示的に utf8 を利用する場合には以下のように行う。

 use utf8;

あと PerlIO 層が便利かつ罠があるとの事。ようは use utf8; して :encoding(UTF-8) 使うのが無難って事かな