13時23分17秒 [Web関連]
偶然かそれとも誰かが図ったのか(^^;)知りませんが、私の周囲で立て続けに文字化けについての質問があったので、ここにちょっと書いておきます。
日本語を表現する文字コードには数種類あるので、記述に使われた以外の文字コードで解釈すると、文章全体が化けます。ブラウザでたまに起こるので経験ある人は多いでしょう。そのときは、正しい文字コードを探して指定すれば、文字化けはなくなります。
で、それは「文章全体が化けてる」ので、「ああ文字コードが違うんだな」と容易に分かるわけですが、「文章の一部分だけが化ける」場合もあります。
大部分の文章は読めるのに、特定の文字だけが化けてしまう…という現象。
(まあこれも良くあるんですが。)
その「特定の文字」というのが、以下に挙げる文字の場合...
「―」,「ソ」,「噂」,「欺」,「圭」,「構」,「蚕」,「十」,「申」,「貼」,「能」,「表」,「暴」,「予」,「禄」,「兔」
原因は、文字コードが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つの方法があります。
2バイト文字の中に「5C」が現れてしまう文字コードはSHIFT-JISだけなので、EUCやUTF-8などの文字コードを使えば、上記の問題は起こりません。
また、問題の起こる文字(2バイト目が5Cな文字)の直後に、「\」記号を1つ加えてやれば文字化けは起こりません。例えば、「表示」なら、「表\示」と入力します。「\」記号が特別な意味を持つ場合、「\」記号そのものを表現するには「\\」と入力します。「表\示」と入力すれば、「表」の2バイト目にある「\」とその直後の「\」とで「\」という文字が表されるので、結果、問題なく「表示」と表示(^^;)できます。
特定のスクリプトに文字列を渡すことで文字化けが起こる…という現象の場合、前者の方法は場合によっては面倒だったり無理だったりすることもあるので、まあ、後者の方法が現実的なのかも知れません。
なお、冒頭で例に挙げた文字は、2バイト目に「5C」を含む文字の一部です。他にも、もっと画数の多い(^^;)文字がいくつかあります。詳しくは、「文字化けをする文字一覧表」あたりを参考にして下さい。
この日記へのコメントはお気軽に! コメント数:5件
お役に立てたようで嬉しいです。(^_^)
投稿者 にしし : 2007年06月15日 23:03
ありがとうございます。
同じくこちらの記事のおかげで一部文字化け問題が解決しました。
投稿者 Shin : 2017年03月27日 18:10
お役に立ったようで何よりです。最近は文字コードにUTF-8が使われることが多くなったので、この手の問題もあまり目にしなくなりました。
投稿者 にしし : 2017年03月28日 09:55
サクラエディタ2.2.0.1にて SJISで、一部の文字化け解決できません。
85 55 は全角の6らしい、
85 58 は全角の9らしいのは分かるのですが。
投稿者 よしかず : 2018年03月09日 08:45
コメント数: 5件
ありがとうざいます!この記事に助けられました。
投稿者 通行人 : 2007年06月15日 11:40