カレンダー

2012/05
  
  
       

広告

Twitter

記事検索

ランダムボタン

文字化けのリズム

by 唐草 [2017/08/18]



 北朝鮮のミサイル発射予告を受けて今日Jアラートのテストを行ったというニュースが流れていた。
 テストでは、いくつかの不具合が見つかったそうだ。滅多に稼働しないシステムなんで見過ごされているエラーや不具合だってたくさんあることだろう。不具合が見つかっただけでもテストを行った価値があるというものだ。テスト結果を受けて適切な改修を行えば、本番ではより良い結果が期待できるだろう。もっとも本番が来ないに越したことはないが。
 ニュースで紹介されていたJアラートテストの不具合の中にぼくの興味を惹いたものがあった。
 それがメールの文字化け。
 ぼくのようにバイナリに親しんでいると文字化けした文字列を見るとどんなエラーで発生した文字化けなのかをだいたい特定することができる。
 文字化けの起こる原因は、大きく分けて次の3つ。

1.正しくない文字コードでデータを開いてしまった
2.複数の文字コードが混在している
3.データ送信時に一部データが欠けてしまった

 NHKから拝借した文字化けメール画像を見てみると、メールの冒頭と末尾は文字化けしていない。このことから2番の文字コード混在の可能性が高いと推測できる。プログラムでメールを書く際に良く起こるミスだ。
 続いて化けている部分を見る。
 冒頭が「2017??08?・8?・11?・0?・」となっている。原文だと「2017年08月18日11時00分」と書かれていたと予想できる。化けていないところに「2017/08/18 11:00:02発表」と書かれているから間違いないだろう。
 「年」とい漢字一字が、化け文字だと2文字分になっている。このことから原文は、2byte文字よりも大きなバイト数を利用していることが分かる。日本語でそんな文字コードは、UTF-8ぐらいしか考えられない。
 では、UTF-8をどの文字コードとして開いてしまうとこのような化け方になるのか。並ぶ漢字からSJISっぽさを感じているが、断定はできない。そこで、たぶんメールに含まれているであろう「アラート」と「島根県」の文字をUTF-8で打ったテキストファイルを様々な文字コードで開いてみた。
 するとSJISで開いたときに画像と同じ化け文字が現れた。ぼくの読みは正しかったようだ。
 以上のことから、次の推測が成り立つ。
 1行目の発表時間と末尾の「しまね防災情報」という文字列は、SJISで書かれている。その間にJアラートから届いたUTF-8の文字を挿入してSJISのまま送信しまったために今回の文字化けが起こった。以上のように考えられる。
 しかしコレは大問題だ。メール送信に関する規約がまとめられたRFCを参照すると、SJISのような仕様の文字コードの送信は推奨されていない。つまり、島根のシステムがSJISメールを垂れ流していると言うことは、メールプロトコル的に規約違反である。今のシステムなら問題が起こるリスクは低いが、過去にはSJISメールが原因でネットワークトラブルが起きたこともある。むしろ今回は、偶然にも無事にメール送信ができたと思った方が良いかもしれない。Jアラートが、ネットワークトラブルの原因になったりしたら笑えないよ。