にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2015/09/22. 13:24:11.

一部の文字だけが化ける文字化けの対策

偶然かそれとも誰かが図ったのか(^^;)知りませんが、私の周囲で立て続けに文字化けについての質問があったので、ここにちょっと書いておきます。

日本語を表現する文字コードには数種類あるので、記述に使われた以外の文字コードで解釈すると、文章全体が化けます。ブラウザでたまに起こるので経験ある人は多いでしょう。そのときは、正しい文字コードを探して指定すれば、文字化けはなくなります。

で、それは「文章全体が化けてる」ので、「ああ文字コードが違うんだな」と容易に分かるわけですが、「文章の一部分だけが化ける」場合もあります。
大部分の文章は読めるのに、特定の文字だけが化けてしまう…という現象。
(まあこれも良くあるんですが。)

その「特定の文字」というのが、以下に挙げる文字の場合...

「―」,「ソ」,「噂」,「欺」,「圭」,「構」,「蚕」,「十」,「申」,「貼」,「能」,「表」,「暴」,「予」,「禄」,「兔」

原因は、文字コードがSHIFT-JISであること、と考えていいでしょう。

SHIFT-JISは、WindowsやMacで標準採用されている文字コードなので、よく使われてます。私も特別な理由がない限りSHIFT-JISを使ってます。ただ、SHIFT-JISは、あんまり良い文字コードではありません。

上記に挙げた文字は、すべて、2バイト目のコードが「5C」です。「貼」は[93][5C]、「能」は[94][5C]、「表」は[95][5C]です。この「5C」というコードが文字化けを引き起こしています。

コード「5C」は、「\」記号(バックスラッシュ(または円マーク))です。この「\」記号は、スクリプト中では特別な意味を持つことがあるため、そのスクリプトに上記の文字を通すと、その文字だけが文字化けしてしまいます。
(まあ、主にCGIに渡すとき、と考えていいと思いますが。)

日本語を表現できる文字コードのうち、SHIFT-JIS以外の文字コード(JIS、EUC、Unicode)では、「5C」を含む2バイト文字は存在しないため、このような文字化けは起こりません。

SHIFT-JISが作られた当時は、問題を解決するために仕方なくこうするしかなかったのでしょうが、なかなか困ったコードなわけです。
特に上記の文字は、よく使われる漢字ですからね。「表示」、「貼付」、「予定」、「能力」、「申告」とかの熟語で出てきます。

「\」記号が特別な意味を持つ場合は、その直後に現れる文字と合わせて、何らかの意味が表現されます。「\n」で「改行」とか。で、「\」が単独で現れた場合は、その「\」はただ無視されます。

「表示」という単語は、SHIFT-JISの文字コードで表現すると、「95 5C 8E A6」となります。「表」が「955C」で、「示」が「8EA6」です。このとき、「5C」が「単独で出てきてる\記号」として無視されるので、「95 8E A6」という文字列だと解釈されます。その結果、「95 8E」で表現される文字である「侮」と、「A6」で表現される半角カタカナ「ヲ」と解釈されるので、「表示」ではなく「侮ヲ」と化けてしまうわけです。

この問題を解決するには、2つの方法があります。

  1. SHIFT-JIS以外の文字コードを使う
  2. 問題のある文字の直後に「\」を1つ挿入する

2バイト文字の中に「5C」が現れてしまう文字コードはSHIFT-JISだけなので、EUCやUTF-8などの文字コードを使えば、上記の問題は起こりません。

また、問題の起こる文字(2バイト目が5Cな文字)の直後に、「\」記号を1つ加えてやれば文字化けは起こりません。例えば、「表示」なら、「表\示」と入力します。「\」記号が特別な意味を持つ場合、「\」記号そのものを表現するには「\\」と入力します。「表\示」と入力すれば、「表」の2バイト目にある「\」とその直後の「\」とで「\」という文字が表されるので、結果、問題なく「表示」と表示(^^;)できます。

特定のスクリプトに文字列を渡すことで文字化けが起こる…という現象の場合、前者の方法は場合によっては面倒だったり無理だったりすることもあるので、まあ、後者の方法が現実的なのかも知れません。

なお、冒頭で例に挙げた文字は、2バイト目に「5C」を含む文字の一部です。他にも、もっと画数の多い(^^;)文字がいくつかあります。詳しくは、「文字化けをする文字一覧表」あたりを参考にして下さい。

コメント

ありがとうざいます!この記事に助けられました。

投稿者 通行人 : 2007年06月15日 11:40

お役に立てたようで嬉しいです。(^_^)

投稿者 にしし : 2007年06月15日 23:03

コメント数: 2件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---