« VistaにOffice 2007の試用版を入れてみました(mailtoプロトコルの関連付け) | トップページ | VistaのWindows Mailとmailtoタグによる本文のプリセット(文字化け問題) »

2007/02/10

VistaのWindows Mailプレビューで文字化けする場合(「髟阡」「瘢雹」の意味。サニタイジングについて)



専用サーバが月額19,800円~

VistaのWindows Mailで下記のような文字化けがプレビュー・ウインドウに表示されることがあります。



他のメールを選択して、また、先ほど文字化けしたメールを再選択しますと文字化けが嘘のように解消していることが多いです。この文字化けは、「髟阡」「瘢雹」が多く登場するのが特徴です。

ただ、この文字化けは、Vistaになってはじめて起こったわけではなく、実はWEB上にこの文字化けはあふれています。

● 「髟阡」の検索結果: 約1,090,000件(2007年2月9日現在)
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=Shift_JIS&oe=UTF-8&lr=lang_ja&q=%E9%95%E8%94

● 「瘢雹」の検索結果: 約 972,000件(2007年2月9日現在)
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=Shift_JIS&oe=UTF-8&lr=lang_ja&q=%E1%8D%E8%B9

いずれも100万件近い検索結果になります。これはGoogleが悪いわけではなく、実際にそのページが文字化けしています。

以前に、この文字化けのアルゴリズムについて興味を持ち、分析してみたことがあります。

まず気が付いたのは、
  • 文字化けしているサイトは、メールのアーカイブ(メーリングリストなどの過去ログのWEB化)がきわめて多い。

  • 文字コードはJIS(ISO-2022-JP)であるものが多い。


  • 全ての文字が文字化けしているのではなく、一部の文字が文字化けしていることも比較的多い。

  • 「瘢雹」「踉」「髟阡」など、かなり頻出する文字化けパターンが存在する。
ということです。そして、

この文字化けの正体は結論から言えば、メーリングリストなどのメール(JISコード=ISO-2022-JP)をWEB化する際に、セキュリティ上の理由から特殊文字をエスケープ処理(サニタイジング)して、余計なものまで変換してしまっているために起こっています。


●「"」(0x22)→「"」= 「0x26」+「0x71」+「0x75」+「0x6F」+「0x74」+「0x3B」=「0x26」+「髟阡」+「0x74」

「"」(0x22)がエスケープされ、「"」となりますが、ここで「&」「q」「u」「o」「t」「;」の6文字のそれぞれのコードを分解してみます。真ん中の「0x71」と「0x75」が結合すると「髟」という漢字になり、同様に「0x6F」と「0x74」が結合すると、「阡」という漢字になります。つまり、「髟阡」なる中国語みたいな文字化けは、「"」(0x22)のエスケープ処理の結果、生じていたのである。「0x22」を持つ文字には「あ」(0x2422)などがありますが、何といっても多用されるのが、「、」(0x2122)です。句読点のない日本語はほとんどありませんから、やたらめったら、この文字化けパターンが出現することになります。

同様に、

●「&」(0x26)→「&」= 「0x26」+「0x61」+「0x6D」+「0x70」+「0x3B」= 「0x26」 + 「瘢雹」

&」(0x26)がエスケープされ、「&」となりますが、ここで「&」「a」「m」「p」「;」の5文字のそれぞれのコードを分解したてみます。真ん中の「0x61」と「0x6D」が結合すると「瘢」という漢字になり、同様に「0x70」と「0x3B」が結合すると、「雹」という漢字になる。このようにして、「0x26」を含む文字が出現すると、「瘢雹」という文字化けが発生することになります。平仮名の「う」(ISO-2022-JPで「0x2426」)には「0x26」が含まれていますので、「う」を含む文章は一歩間違うと「瘢雹」が誕生することになります。



〔ラピッドサイト〕仮想専用サーバ「VPS!RVシリーズ大好評」

さらに、

●「<」(0x3C)→「<」= 「0x26」+「0x6C」+「0x74」+「0x3B」=「0x26」+「踉」+「0x3B」

長音の「ー」は1バイト目が「0x21」、2バイト目が「0x3C=『<』」のため、このように「踉」が出現する文字化けになることが多いです。長音の「ー」の1バイト目の0x21と、残った「0x26」が合体すると「・」になるため、結果的に「・踉」のような文字化けを見ることが多いです。

● 「踉」の検索結果: 約 1,100,000件(2007年2月9日現在)
http://www.google.co.jp/search?hl=ja&q=%E8%B8%89&lr=

このように、セキュリティ上の理由からエスケープ処理(サニタイジング)が適切に行われていないことが原因で、この「瘢雹」「髟阡」という文字化けは起こっていると思われます。

VistaのWindows Mailでこの文字化けが発生して、別のメールをプレビュー後、再選択した際に文字化けが解消しているのは、プレビューの処理中には常に文字化けしてプレビューが行われる可能性があるが、普段はプレビューは一瞬のうちに処理されるので気にならないが、何らかの理由でプレビューに時間がかかると問題が表面化するということかもしれません。

ただ、上述のGoogleの検索結果に見られる、メーリングリスト・アーカイブの文字化けは、ISO-2022-JPという文字コードの特性を無視したプログラミングミスが原因だと思われます。

例えば、PHPには「htmlspecialchars」という関数がありますが、これをJIS(ISO-2022-JP)の文字列に適用すると、本来変換されるべきでない漢字までエスケープされて、その結果、文字化けが発生します。PHPでJISの文字列に対してエスケープ処理するには、

  • JISコードでは、エスケープシーケンスというものを使って、2バイト文字、1バイト文字を区別しています(いわゆる漢字IN/漢字OUT)。2バイト文字の出現を示すエスケープシーケンス(1B 24 42)が現れたら、2バイト文字列の一部なので、たとえ、「0x26」「0x3C」「0x3E」などのコードを見ても無視してエスケープしないようにします。つまり、文字列全体を一バイトずつ切り出し(ループ処理を行い)、今処理しているのは2バイト文字の一部なのか、1バイト文字(ASCII文字)なのかを判別しながら、処理します。

  • 文字列全体をEUC-JPにいったんmb_convert_encoding関数で変換し、それをエスケープ処理した後に、再びmb_convert_encodingでJISに変換します。あるいは、JISでWEB公開することにこだわらないのであれば、EUC-JPで公開するようにします。
の二通りの方法が"一応"考えられるかと思います。

前者のやり方は、多少複雑な処理が必要です。JISのコード体系について理解する必要があるでしょう。

|

« VistaにOffice 2007の試用版を入れてみました(mailtoプロトコルの関連付け) | トップページ | VistaのWindows Mailとmailtoタグによる本文のプリセット(文字化け問題) »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67411/13851926

この記事へのトラックバック一覧です: VistaのWindows Mailプレビューで文字化けする場合(「髟阡」「瘢雹」の意味。サニタイジングについて):

» Windows Vista への対応度調査 [テニスそしてスキー ]
私の所持しているパソコンは3台ですが、XP Pro が インストールされている (2)のパソコンは Vista のどのエディションにアップグレード可能かを、 Windows Vista Upgrade Advisor を使って調べてみました。 [続きを読む]

受信: 2007/02/11 01:39

« VistaにOffice 2007の試用版を入れてみました(mailtoプロトコルの関連付け) | トップページ | VistaのWindows Mailとmailtoタグによる本文のプリセット(文字化け問題) »