JISコードとESCシーケンス

JISコードとASCIIコードの対応関係を把握すると、文字化けの理屈(?)が少し分かりやすくなります。代表的な例をとりあげて、文字化けの解読法を探ります。

※文字化けと文字コードの関連を詳しく解説した『プロフェッショナル電子メール』を上梓しました。

JISコードとASCII

日本語と文字コード」や「インターネット上でのJISメールについて」で述べたように、JISコードによる日本語メールのやりとりは、[ESC]文字と$B(Bなどの文字を組み合わせた「エスケープシーケンス」で、文字セットを切り替えています。この[ESC]文字が抜け落ちるのが、文字化けの原因の一つでした。

JISコードはASCIIコードと同じビットパターン(1と0の組み合わせ)を用いている(*注)ので、[ESC]が脱落すると、ASCII文字の無意味な羅列のように見えます。ここでは、ASCIIのどのようなビットパターンがJISコードによる日本語に対応するかを確認することで、文字化けの解読法方を探ってみます。

ESCの抜け落ちたJISコード

下の表は、日本語の文章ならほぼ必ず出現するであろうひらがな、カタカナ、句読点と、そのJISコードに相当するビットパターンを持つASCIIコードの組み合わせを上下に並べたものです。これを見ると分かるように、ひらがなは全て $ とアルファベットや記号の組み合わせになっています。カタカナは % と、記号は ! " との組み合わせです。文字化けメールにやたら「$」や「!」が目立っているのは、偶然ではありません。ひらがなや句読点を使うと、必然的にこれらの文字に相当するビットパターンが使われるのです。

たとえば、メールの最初によくある「こんにちは。」というフレーズに対応するのは

(例)$B$3$s$K$A$O!#(B

というものになります。なんか見たことあるような文字化けですね! (ただし最初の$Bと最後の(Bは文字コード切換のためのエスケープシーケンスの一部です)「文字化けしたメールを復元する」のプログラムは、文字化けテキストの中からこうした部分を拾い出し、$B(Bの前に[ESC]コードを補うことで日本語を復元しています。

なぜか8ビット目が追加された場合

まれに、 $ や ! だらけになったものではなく、

(例)、ェ、メ、オ、キ、ヨ、熙ヌ、ケ。」

という奇妙な文字化けに出会うことがあります。これは、本来7ビットであるはずのJISコードに、何らかの理由で8ビット目が加わった(言い替えれば、EUCコードに変換された)ことによって生じる現象です。この文字列の8ビット目をカットしてみると

(例)$*$R$5$7$V$j$G$9!#

という、前節で見たような $ や ! が繰り返される文字列になりました。さらにJISコードとして認識するためのエスケープシーケンスを前後に補ったところ、この文字列は

(例)おひさしぶりです。

という文字列に復元されました。ここでは、 $ (0x24) が1バイト(半角)の「、」 (0xA4) に、 ! (0x21) が同じく1バイトの「。」 (0xA1) になっているので、これらが目に付く場合は、8ビット目が付加された可能性が高いと言えます。「文字化けしたメールを復元する」では、本来必要のない8ビット目は、自動的に切り捨てるような設定にしています。

部分的な欠落

少し応用問題です。届いたメールが

(例)、ェ磐サ\xF6、「、熙ャ、ネ、ヲ、エ、カ、、、゙、キ、ソ。

のようになっています。前のセクションから、これは第8ビットが付加されたものだろうと考えられるので、8ビット目を切り捨て、さらにエスケープシーケンスを補ってみましたが、結果は

(例)お峪\xEB「△蠅\x86「箸Δ瓦兇い泙靴拭\x82:\x84タ

となってしまい、判読できません。こういうときは、いちどこのテキストのエスケープシーケンスを無視して、ASCIIのビットパターンとして読んでみます(*注)。この文字列の場合は、対応するASCII文字列は

(例)$*V;v$"$j$,$H$&$4$6$$$^$7$?!#

となっています。最後の2バイト「!#」は、JISの「。」に対応するものですね。しかも、これを後ろから順に追っていくと、ずっと「$」と記号や数字の組み合わせになっています。ということは、これはひらがなによって構成された文字列の、上下バイトの位置がずれてしまって、文字化けしたのではないかと推測することができます。

$」を頼りに前と後ろから攻めていくと、3-5バイト目のV;vが怪しいことが分かります。なぜなら、後ろから辿ると、最後の「。」に相当する部分を除いて、ここまでは全て「$」+記号というペアが成立しており、最初の2バイトはきちんと「お」になっているからです。そこで、こころみに3バイト目の V を削除してエスケープシーケンスを補ってみると、この文字列はJISコードとして

(例)お事ありがとうございました。

というものとなりました。これはきっと「お返事・・・」という文だったに違いない! 「返」という文字に対応するASCIIのビットパターンを調べてみると「JV」になっています。すなわち、ここでは何らかの理由で「J」に相当するバイトが欠落したため、2バイトで表現される日本語(JISコード)がみんなずれてしまい、文字化けになってしまったというわけです。

この手法で文字化けメールを復元するのはなかなか大変ですが、「。」に対応する「!#」やひらがなの特徴である「$」に注目すると、正確な解読はできなくても、意味が通る程度には、かなりの確率で復元が可能なことがあります。

解読の行き過ぎ

文字化けしたメールを復元する」のプログラムは、以上のような方法を組み合わせて日本語を復元していますが、文字コードの判別を誤り、本来ASCIIのままでよいところにもエスケープシーケンスを付加してしまう可能性があります。たとえば

(例)冒鱗阻必浴黶蓍粤

なんてのは、実はASCIIビットパターンとしてみると

(例)[ESC]$BKANZAKI,Masahide[ESC](B

というものです。ASCIIで読めばなんの問題もなかったのに、余計なエスケープシーケンスを加えたために、奇妙な日本語が出来上がってしまったのですね。そんなわけで、文字化けの復元に当たっては、ASCII文字列も参照しながら解読することをお勧めいたします。

JISとASCIIの対応表

JIS(上段)とASCII(下段)で同じビットパターンの組み合わせに相当するものをいくつか示します。文字化けメールで目にするものがたくさんあるのではないでしょうか。

■ひらがな

  ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し 
  $! $" $# $$ $% $& $' $( $) $* $+ $, $- $. $/ $0 $1 $2 $3 $4 $5 $6 $7 

  じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の 
  $8 $9 $: $; $< $= $> $? $@ $A $B $C $D $E $F $G $H $I $J $K $L $M $N 

  は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ 
  $O $P $Q $R $S $T $U $V $W $X $Y $Z $[ $\ $] $^ $_ $` $a $b $c $d $e 

  ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん
  $f $g $h $i $j $k $l $m $n $o $p $q $r $s

■カタカナ

  ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ 
  %! %" %# %$ %% %& %' %( %) %* %+ %, %- %. %/ %0 %1 %2 %3 %4 %5 %6 %7 

  ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ 
  %8 %9 %: %; %< %= %> %? %@ %A %B %C %D %E %F %G %H %I %J %K %L %M %N 

  ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ 
  %O %P %Q %R %S %T %U %V %W %X %Y %Z %[ %\ %] %^ %_ %` %a %b %c %d 

  ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ 
  %e %f %g %h %i %j %k %l %m %n %o %p %q %r %s %t %u %v 

■記号

    、 。 , . ・ : ; ? ! ゛ ゜ ´ ` ¨ ^  ̄ _ ヽ ヾ ゝ ゞ 〃 
  !! !" !# !$ !% !& !' !( !) !* !+ !, !- !. !/ !0 !1 !2 !3 !4 !5 !6 !7 

  仝 々 〆 〇 ー ― ‐ / \ 〜 ‖ | … ‥ ‘ ’ “ ” ( ) 〔 〕 [ 
  !8 !9 !: !; !< != !> !? !@ !A !B !C !D !E !F !G !H !I !J !K !L !M !N 

  ] { } 〈 〉 《 》 「 」 『 』 【 】 + − ± × ÷ = ≠ < > 
  !O !P !Q !R !S !T !U !V !W !X !Y !Z ![ !\ !] !^ !_ !` !a !b !c !d 

  ≦ ≧ ∞ ∴ ♂ ♀ ° ′ ″ ℃ ¥ $ ¢ £ % # & * @ § ☆ ★ ○ 
  !e !f !g !h !i !j !k !l !m !n !o !p !q !r !s !t !u !v !w !x !y !z !{ 

  ● ◎ ◇ ◆ □ ■ △ ▲ ▽ ▼ ※ 〒 → ← ↑ ↓
  !| !} !~ "! "" "# "$ "% "& "' "( ") "* "+ ", "-

[ESC]
エスケープ文字を表す。エスケープ文字は 0x1B というビット値を持つコントロールコードで、文字コードを切り替えるための目印となるシーケンス(バイト列)を開始させる。エディタで見ると^[と表示されることもある。
JISはASCIIと同じビットパターン...
つまり、同じ 0x242B という16ビットのビットパターンが、JISとして解釈されると「か」となり、ASCIIなら「$+」に相当するというようなこと。同じビットパターンで表される文字がどのコードセットのものかを切り替えるのがエスケープシーケンスである。
ASCIIのビットパターンとして読んでみる
Web上ならソースコードを見てみる。メールやエディタなら、JISコードで保存し、フォントをcourierなどにするか、S-JISしか扱えないエディタで開いてみる。