Perlで日本語の文字コードを取得する

目的は、ゲームとかで文字を表示する際に、
文字を画像データで持っておいて、切り貼りする必要があって、
その画像データを作るために、ちょっとだけ調べてみた。

use v5.14;
use strict;
use warnings;

use Encode qw(decode encode);
use utf8;

my $aiueo = 'あいうえお';

foreach ( split //, $aiueo ) {
    my $kana = $_;
    #my @tmp = unpack( 'W*', encode('UTF-8', $kana, Encode::FB_CROAK) );
    my @tmp = unpack( 'U*', encode('unicode', $kana, Encode::FB_CROAK) );

    say sprintf( '0x%2X', $tmp[0] );
}

say "------------------";

say join( ', ', map {
    sprintf( '0x%2X', $_ );
} unpack( 'U*', encode('unicode', $aiueo, Encode::FB_CROAK) ) );

こんな感じのスクリプトをUTF-8で保存して、実行するとこんな感じ。

$ perl aaa.pl
0x3042
0x3044
0x3046
0x3048
0x304A
------------------
0x3042, 0x3044, 0x3046, 0x3048, 0x304A

最初はUTF-8でやろうと思ってたので、その名残が残ってるんだけど、
ひらがなとカタカナのみ扱う予定なので、
どういう風にするのが良いかは、これから考える方向で。

ちなみに、encodeを呼ぶ際の引数に設定する文字列は、
変換したい文字列を変数に代入する必要があるらしく、
こんな感じで実行するエラーになる。

use v5.14;
use strict;
use warnings;

use Encode qw(decode encode);
use utf8;

say join( ', ', map {
    sprintf( '0x%2X', $_ );
} unpack( 'U*', encode('unicode', 'あいうえお', Encode::FB_CROAK) ) );

$ perl bbb.pl
Modification of a read-only value attempted at /Users/xxx/perl5/perlbrew/perls/perl-5.20/lib/5.20.0/darwin-2level/Encode.pm line 160.

でも、Encode::FB_CROAKを外せば、
想定した結果を得られるので、この辺は宿題ですね。(*1)

おしまい。

(*1) 引数で渡した文字列が変更されるのかどうか分かってないという意味

Leave a Comment