『かんたんPerl倶楽部』

技術評論社から発刊された拙著『かんたんPerl』のサポート ブログです。本書への質問、本書に載せきれなかったテクニック、セミナーなどの情報(予定)などを載せていきます。※正誤表の情報はこちらをご覧ください。

カテゴリ: Perl使いのための文字コード入門

 2週間ほど間が空いてしまってスミマセン。これからまたバリバリ書きます。

 さて、今回は、文字コードISO-2022-JP-1とPerlについて述べます。
 ISO-2022-JP-1は、ISO-2022-JP同様、ISO 2022の仕組みを使った文字符号形式です。

 Opus 35で述べた通り、ISO 2022はISOが定めた文字符号化形式の規格で、ISOと2022の間に空白が入ります。
 Opus 36およびOpus 40で述べた通り、ISO-2022-JPおよびISO-2022-JP-1は、ISO 2022に準拠した文字符号化方式の仕組みで、ISOが定めたものではなく、インターネットユーザーの間での取り決めを定めたRFCに入っています。ISO-2022-JPはRFC 1468、ISO-2022-JP-1はRFC 2237です。ISOと2022の間にハイフンが入ります。

 ISO-2022-JPは、7ビットコードで、エスケープシーケンスを使ってASCII、JIS X 0201ローマ字、JIS X 0208(JIS基本漢字)を切り替えます。
 ISO-2022-JP-1は、ISO-2022-JPを拡張したもので、やはり7ビットコードで、エスケープシーケンスを使ってJIS X 0212(JIS拡張漢字)を使えるようにしたものです。JIS X 0212の始まりを示すエスケープシーケンスはESC $ ( Dです。

 以下のコードを実行します。

#! /usr/local/bin/perl
# test_iso-2022-jp-1.pl -- iso-2022-jp-1の実験

use strict;
use warnings;
use 5.010;
use utf8;
binmode STDOUT, ":encoding(iso-2022-jp-1)";

say "ABアイ\n〆乄\n№ς";

42

 出力された文字と文字コードを並べてみます。

41 42 1b 24 42 25 22 25 24 1b 28 42 0a
A  B  Esc $  B  ア   イ   Esc (  B  \n

1b 24 42 21 3a 1b 24 28 44 30 31 1b 28 42 0a
Esc $  B  〆   Esc $  (  D  乄   Esc (  B  \n

1b 24 28 44 22 71 26 78 1b 28 42 0a
Esc $  (  D  №   ς    Esc (  B  \n

 最初にASCIIの「AB」を出力しますが、これはISO-2022-JP-1のデフォルト状態ですので、エスケープシーケンスは入りません。
 次にJIS X 0208の「アイ」を出力しますが、ここでJIS X 0208のエスケープシーケンスEsc$Bが挟まれます。で、JIS X 0208の7ビット符号0x2522(ア)、0x2524(イ)が出力されます。
 行末はASCIIに戻しますので、ASCIIのエスケープシーケンスEsc(Bが挟まれ、改行コード\nが出力されます。
 2行目はJIS X 0208の「〆」(Unicodeスカラー値はU+3006)につづいて、JIS X 0212の「乄」(同じくU+4E44)を表示してみました。
 まずJIS X 0208のエスケープシーケンスEsc$Bが出力され、「〆」の7ビット符号0x213Aが出力されます。
 次にJIS X 0212のエスケープシーケンスEsc$(Dが出力され、「乄」の7ビット符号0x3031が出力されます。
 行末は前の行と変わりません。
 最後の行は、JIS X 0212の記号である№とς (ファイナルシグマ)を表示してみました。やはりエスケープシーケンスEsc$(Dにつづいて、0x2271(№)、0x2678(ς )が出力されます。

 さて、同じコードのencoding指定を、ちょっといたずらして、iso-2022-JP-1に変えてみたらどうなるでしょうか。

#! /usr/local/bin/perl
# test_iso-2022-jp-1_err.pl -- iso-2022-jp-1の実験(エラー)

use strict;
use warnings;
use 5.010;
use utf8;
binmode STDOUT, ":encoding(iso-2022-jp)";

say "ABアイ\n〆乄\n№ς";

58

 こういう状態に文字化けします。

41 42 1b 24 42 25 22 25 24 1b 28 42 0a
A  B  Esc $  B  ア   イ   Esc (  B  \n

1b 24 42 21 3a 1b 24 28 44 3F 3F 1b 28 42 0a
Esc $  B  〆   Esc $  (  D  扤   Esc (  B  \n

1b 24 28 44 3F 3F 3F 3F 1b 28 42 0a
Esc $  (  D  扤   扤    Esc (  B  \n

 0x3F3Fの扤という字はJIS X 0212の31区31点ですが、この字に意味があるわけではなく、ISO-2022-JPの文字レパートリーにないJIS X 0212の字がASCIIの0x3F(?=疑問符)に変えられているだけです。

 Perlのbinmodeのiso-2022-jpでは、JIS X 0212の字があっても、エスケープシーケンスのEsc$(Dは挿入されるので、??が扤というJIS X 0212漢字に化けてエディターで表示されてしまいました。
 扤(JIS X 0212の0x3F3F)は「ゴツ」「ゴチ」「ゲツ」「ガチ」「うごく」という字だそうです。

扤 - Wiktionary

 JIS X 0212の文字は、ISO-2022-JPには入っていないので、文字化けするのは予定の動作ですが、Perlで:encodingにiso-2022-jpを指定すると、iso-2022-jp-1同様にJIS X 0212のエスケープシーケンスEsc$(Dだけはなぜか予定通り入ってしまいます。


↑このページのトップヘ