本日は前回のISO-2022-JPのPerlにおける使用法について研究します。
 PerlのUnicodeサポートでは、iso-2022-jpというEncode名でISO-2022-JPをサポートします。

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

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

say "ABアイ\nウエ12\nオカ";

 ちょっと洒落心で最後の行に半角カナを入れてみました。
 どうなるでしょう。

[sample]$ ./test_iso-2022-jp.pl > iso.txt
AB^[$B%"%$^[(B
^[$B%&%(^[(B12
^[$B%*%+^[(B
[sample]$ ./test_iso-2022-jp.pl > iso.txt

 端末がUTF-8状態だったので文字化けしてしまいましたので、iso.txtというファイルにリダイレクトしました。
31

 出力された文字をダンプしてみます。

A  B  Esc $  B  ア   イ    Esc (  B (改行)
41 42 1b 24 42 25 22 25 24 1b 28 42 0a
Esc $  B  ウ   エ    Esc (  B  1  2 (改行)
1b 24 42 25 26 25 28 1b 28 42 31 32 0a
Esc $  B  オ   カ    Esc (  B (改行)
1b 24 42 25 2a 25 2b 1b 28 42 0a

 半角カナは全角カナに変換して表示されていますね。

 一方、Perlは7bit-jisというエンコーディング名もサポートしています。これも使ってみます。

#! /usr/local/bin/perl
# test_7bit_jis.pl -- 7bit jisの実験

use strict;
use warnings;
use 5.010;
use utf8;
binmode STDOUT, ":encoding(7bit-jis)";

say "ABアイ\nウエ12\nオカ";

42

A  B  Esc $  B  ア   イ    Esc (  B (改行)
41 42 1b 24 42 25 22 25 24 1b 28 42 0a
Esc $  B  ウ   エ    Esc (  B  1  2 (改行)
1b 24 42 25 26 25 28 1b 28 42 31 32 0a
Esc $  I  ヲ  カ  Esc (  B (改行)
1b 24 49 35 36  1b 28 42 0a

 7bit-jisは、半角カナをサポートしています。
 これは、ISO-2022-JPに半角カナを追加したもので、切り替えにISO 2022の枠組みのEsc $ I(0x1B 28 49)を入れています。Microsoft Outlook方式ですね。

 ISO-2022-JPは、RFC1468というインターネットの決まりで明文化されているものですが、RFC1468には半角カナはありません。
 が、ISO 2022には、JIS X 0201の右面7ビット符号(いわゆる半角カナbの7ビットコード)のエスケープ シーケンスがEsc $ Iであるむね明記されています。

 画面を見ると、MacのCot Editorはこの形式を解しますね。Emacsも、Windowsも秀丸もxyzzyもサクラエディタもこの方式を解して半角カナを表示するので、この方式はISO-2022-JPの半角カナ許容拡張としてはポピュラーな方式でしょう。
 Perlの:encoding指定では、iso-2022-jpが半角カナを全角カナに変換し、半角カナを通すには7bit-jisにする必要があるので注意しましょう。