通常であれば・・・文字コードの問題だとか、エンコードの問題・・・であれば文章全部が文字化けするとか、文章の題名部分が文字化けするというのが一般的だと思いますが、詳しく聞いてみるとどうもメールの一部分だけが文字化けするという不思議な症状が起きているらしい。
残念ながら社内メールサーバのほうが何か悪いんじゃないかという疑いが掛けられてしまい、調べざるを得ない状況になってしまった。
文字化けしたメールの本文を入手することができたので、いろいろ条件を変えてやってみたのですが、どうもWindowsLiveから社内メールサーバにメールを送るときに文字化けが発生する。Gmailから送るときは文字化けしない。
で、調査してみた。
使用したテスト文字列
HTML形式で文字化けが起こるかテスト!JISコードを考慮して、適度にKI/KOコードが混じることを考慮して半角/全角が入り乱れた文字列としてます。
※事前にWindowsLiveもGmailもJIS(ISO-2022-JP)の文字コードが使われることと、HTMLメールのエンコードが7bitで行われ、同条件であることは確認済み。
※すでにKI/KOコード(Kanji In/Kanji Out)も過去のとなっており、漢字コード表の増加などの変更が加えられ、今ではもっとモードが増えている。が、ここでは解りやすいのでKI/KOコードあるいはSI/SOコードと表現する。
昔からコンピュータ上で日本語を扱う時の話は面倒くさい。現在おもに使われている文字コードだけでも、UTF-8、EUC-JP、Shift-JIS(MS漢字)、ISO-2022-JP(JIS)と乱立してる上に、文字コード上の文字は完全に互換がなかったり、7ビット/8ビット(上位ビットを落とす)の話があったり・・・。
で、GmailとLiveから同様のメール(延々と改行無しで繰り返したテスト文字列)を送信して、どのようになるかをチェック。
・GmailからHTML形式で送った場合のソース(抜粋)
Content-Type: text/html; charset=ISO-2022-JP→適度な改行が自動的に挿入されており、1行の文字数は概ね150文字以内に収まって居る。
Content-Transfer-Encoding: 7bit
HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが
起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML
形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるか
テスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文
字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが
起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML
・LiveメールからHTML形式で送った場合のソース(抜粋)
Content-Type: text/html; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:メイリオ
}
</style>
</head>
<body class='hmmessage'>
HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML 形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML 形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML
形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML 形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML�
A<0$GJ8;z2=$1$,5/$3$k$+%F%9%H�!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML 形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML 形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式で文字化けが起こるかテスト!HTML形式�
→改行の前後で文字化けが発生している。
上記の文字列をJISコードそのままの表記したとき。
HTML形式で文字化けが起こるかテスト!
16進数で表記したとき
48 54 4d 4c 1b2442 3741 3c30 2447 4a38 3b7a 323d 2431 242c 352f 2433 246b 242b 2546 2539 2548 1b2842 21 0aJISなので、KI/KOコードが付加されて、H T M L [KI] 形 式 で 文 字 化 け が 起 こ る か テ ス ト [KO] ! [改行]という感じになっている。
JISコードのKIKOコードが無視されて解釈されたときの表記
HTML7A<0$GJ8;z2=$1$,5/$3$k$+%F%9%H!
ソースコード上の文字化けのパターンと、KIKOコードを無視した時の文字列のパターンは見事に一致しており、明らかにKI/KOコードがぶっ壊れてしまっているのが解る・・・。
RFC821によると、メールの本文1行の長さは改行コード(CR+LF)を含めて1000バイトとなっているため、中継するメールサーバの設定によっては998バイトで自動的にCR+LFが挿入されても文句は言えない。
通常の文章であれば40文字程度で改行を入れるはずなので、自動的に改行コードが挿入されることは無く、問題にならない。しかし、Windows Liveのメールはデフォルトでリッチテキスト形式(HTML形式)であった。しかも、文章の改行は<BR>タグで表現された状態であり、テキストの行は分割されていない状態であった。
そのためどうやら中継したメールサーバによってKI/KOコードのど真ん中に改行コードが挿入されてしまい、文字化けを引き起こしたと。
そういう訳らしい。これが例えばBase64でエンコードされていればまったく問題にならなかったのだが、7bitエンコード(=JISコードであれば、そのまま直接送信)であったために文字化けという形で露呈したようだ。
WindowsLiveからいろいろな本文でメールを送ってみたが、運悪くKIKOコードが改行部分にかぶらなければ、この症状は出ない。極端な話、すべて全角文字で構成されたメールであれば問題が起こらないという話になる。
ちなみにメールサーバの設定では一行の長さ制限はもっと長い2048バイトで設定されており、RFCの解釈として正しいかは別として設定には問題が無いという結果になった。
激しく無駄な時間を過ごした気が・・・。
コメント