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しか扱えないエディタで開いてみる。