さて本日のPerlネタは文字コードについてです。
たまーに入力されている文字のコード値が知りたくなりますよね? いや、なるんですよ、知りたくなる人もいるんですよ。はい、そんな一人である私も先日ちょっと16進表現のコード文字列が必要になることがありましたので、Perlで手軽に出力する方法をご紹介します。
Perl内部で文字コードのエンコードを手軽に行なうにはEncodeモジュールの from_to というものを利用します。from_toというくらいなので下のデータのエンコードと変換したいエンコードを指定します。これで処理を行なうと指定したエンコードで変換されたデータが得られますのでその値をunpackで表示するという算段です。まあ使い方自体は大して難しくないのでソースをさくっと見てみましょう。
#!/usr/bin/perl
use utf8;
use Encode;
use strict;
# UTF-8フラグを落とす
my $buf = Encode::encode_utf8('ひらくん');
# UTF-8⇒UTF-16文字コード変換
Encode::from_to($buf, 'UTF-8', 'UTF-16BE');
my $is_u16 = uc unpack("H*", $buf );
print $is_u16 . "\n";
処理結果:
30723089304F3093
ここでポイントとなるのはPerlのUTF8フラグというものです。use utf8をしてソースをutf8で記述している場合、Perlの変数はutf8フラグがonの状態になっています。この状態ですとPerlは変数内のデータをUTF8の文字として扱ってくれるので文字数のカウントなどもバイトサイズではなく、きちんと文字数を返してくれるわけです。ただ from_to の処理ではこのUTF8フラグがonになっていると都合がわるいのでこれをoffにする必要があります。それが encode_utf8 です。
from_to で指定するエンコードの種類ですが基本的にはfrom側がutf8でto側になにか別のエンコードを指定することになるかと思います。そのさいに指定できるエンコードの種類は次の方法で確認かのうです。
@list = Encode->encodings(":all");
for (@list) {
print $_ . "\n";
}
それでは今回はここまでー