EUC を JIS に変換する関数

 日本語の EUC 文字列を、JIS 形式に変換する関数です。半角のカタカナにも対応 しています。同機能を持ったものが多数公開されていますが、自作愛好派なので自分 で作りました。
 元々は、お仕事用のメール自動送信スクリプトに組み込むために作成した物ですが、 お仕事自体が中途でキャンセルとなったため、実使用となる前での物を公開しています。  そのため、数十例の動作確認を行ったのみで厳密なテストは行っておりません。 当然のことながら、トラブル対応や何らかの保証も出来ません。
 本関数を利用して、メールの Subject を生成するための MIME+BASE64 でエンコード を行う関数も作成しております。そちらの方も、そのうちに 「Perl納戸部屋」 に掲載予定です。

 ちなみに、この HTML 上では漢字がシフトJIS になっていますが、本来は EUC 向けと なっています。


##############################################################################
#    EUC-jp(2byte) の文字列を JIS 形式に変換する(半角カタカナ対応)
##############################################################################
sub str_euc2jis
{
    # エスケープシーケンスの定数値。サブルーチン内部で代入しているが、当然グローバルでも可 
    my ($esc_x0208) = "\e\$B";    # to JIS-X0208-1997 (漢字)
    my ($esc_x0212) = "\e\$(D";   # to JIS-X0212 (補助漢字)
    my ($esc_hkana) = "\e(I";     # to JIS-X0201 半角カタカナ
    my ($esc_ascii) = "\e(B";     # to ascii code
    my ($wk) = $_[0];

    # 最後が ASCII/制御コードでなければ最後にエスケープシーケンスを追加
    if ($wk =~ /[0x00-0x7f]$/) {
        $wk .= $esc_ascii;
    }

    # 半角カナシフトイン導入
    $wk =~ s/([^\x8e].)([\x8e][\xa0-\xdf])/\1$esc_hkana\2/g;
    $wk =~ s/(^[\x8e])/$esc_hkana\1/;
    # 半角カナシフトアウト導入(EUC漢字の前には入れない)
    $wk =~ s/([\x8e][\xa0-\xdf])([\s\x21-\x7f])/\1$esc_ascii\2/g;
    # 半角カナの7bit化
    $wk =~ s/[\x8e]([\xa0-\xdf])/pack("C",ord($1)&0x7f)/ge;

    # 漢字シフトイン導入
    $wk =~ s/([^\xa1-\xfe])([\xa1-\xfe][\xa1-\xfe])/\1$esc_x0208\2/g;
    $wk =~ s/(^[\xa1-\xfe][\xa1-\xfe])/$esc_x0208\1/;
    # 漢字シフトアウト導入
    $wk =~ s/([\xa1-\xfe][\xa1-\xfe])([^\e\xa1-\xfe])/\1$esc_ascii\2/g;

    # 全てを 7 bit 化
    $wk =~ tr/\x80-\xff/\x00-\x7f/;

    return $wk;
}

総合ホームページ Perl納戸部屋