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

Presented by Nishishi via Movable Type. Last Updated: 2022/03/25. 10:40:41.

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

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

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

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

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

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

原因は、文字コードが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

ありがとうございます。
同じくこちらの記事のおかげで一部文字化け問題が解決しました。

投稿者 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件

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



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

※ご投稿頂いた内容は、掲載前に管理者が確認する設定にしている場合があります。たいていは数日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

著者紹介


にしし(西村文宏)

にししでございます。本書いたり記事書いたりしてます。あと萌えたり。著書5冊発売中です(Web製作系4冊+小説1冊)。著書や記事は「西村文宏」名義。記事は主にAll Aboutで連載。本の最新刊は2011年3月に発売されたライトノベルでございますよ。

Twitter:にしし/西村文宏
にしし/西村文宏 on facebook にしし/西村文宏 on mixi フォローはお気軽に!

にしし(西村文宏)連絡先
☕ コーヒーをおごる

著書一覧と詳細

にししふぁくとりー Sakura scope内限定での主要なカテゴリ

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