文字化けについて
- シフトJISコードで「表示」という文字を、CGIスクリプト中に記述して出力すると「侮ヲ」と文字化けします。
- 「侮」という文字から、何だかコンピュータに馬鹿にされている気持ちになったりもします。
- どうしてこのように文字化けしてしまうのでしょうか? このコーナではそんな文字化けについて考察してみます。
- まず日本語文字コードの基礎知識として、大きく以下のようなコードが存在することを理解しておきましょう。
文字コード 摘要 JISコード JIS規格のX0208で定められた文字集合。7ビットコード2文字で日本語文字を表現します。メールで使用する代表的な文字コード。 EUCコード 日本語UNIX環境で使用される文字コード。8ビットコードで表現されます。 シフトJISコード Microsoft社が決めたコードで、主にパソコンを基盤に、WindowsやMacで使用されます。8ビット領域も使用します。 Unicode すべての文字を2バイトで表し、世界中の文字を表現しようとしています。
- KENT WEBではCGIスクリプトは「シフトJISコード」で記述しています。
- 本当は文字化けや正規表現処理などを考慮するとEUCコードで書く方が都合がよく、もし自分のためだけに使用するCGIスクリプトであるならば、迷わずEUCコードで記述することでしょう。
- ここでさきほど述べたシフトJISの「表示」という文字コードは以下のとおりです。
文字 表 示 シフトJISコード 95 5C 8E A6
- ここで都合の悪いことが発生します。実は、「表」の2バイト目の「5C」に問題があるのです。
- つまり、「5C」とはメタ文字(特殊文字)の「\」を表すからです。
- 「\」が文字列中にあると、それはエスケープ記号として単に取り去られてしまいます。
- したがって、「表示」という文字をCGIが出力するときには以下のように展開してしまいます。
(1) 95 5C 8E A6 .... 記述時点 (2) 95 8E A6 .... 「5C」を「\」と解釈し取り去る(その次の8Eをエスケープすると解釈) (3) 95 8E A6 .... 展開結果
- このようにして、展開結果は以下のようなコードで出力されることになります。
文字 侮 ヲ (半角) シフトJISコード 95 8E A6
- このような文字化けを防止するには以下のような方法があります。
- 「表」のようなメタ文字を含む文字には、後にエスケープ記号「\」を付ける。
例 : print "表\示";
理由 : 「表 + \」という文字コードで 95 5C 5C となり、中央の 5C が次の 5C をエスケープ展開し、結果として 95 5C として出力される。
- ダブルクオーテーションマーク「"」で囲まずに、シングルクオーテーションマーク「'」を使用する。
例 : print '表示';
理由 : シングルクオーテーション「'」内では文法上「展開」処理をしないため、文字コードの 95 5C はそのまま解釈されて出力される。
- 「表」のようなメタ文字を含む文字には、後にエスケープ記号「\」を付ける。
- 「表」のように2バイト目に「5C」のコードが使われている文字は以下のとおりです。
*これらの文字を使用する際は「表」に対する対処法とまったく同じです。― ソ Ы Ⅸ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 偆 砡
- 【注意】ただし、この文字化け文字(2バイト目に 5C が来る文字)をエスケープしない状態で「ダブルクオーテーション」又は「シングルクオーテーション」の中で末尾に使う場合には文字化けとはならずに Perlが「文法エラー」となってしまうので、特に注意が必要です。
この場合の対処方法は前掲と同じで直後にエスケープ記号「\」を付加します。- 悪い例1 : $title = "計画表"; → サーバエラー(文法エラーとなる)
- 悪い例2 : $title = '計画表'; → サーバエラー(文法エラーとなる)
- 良い例1 : $title = "計画表\";
- 良い例2 : $title = '計画表\';
- ★以上の文章以下のurlから:
- http://www.kent-web.com/pubc/jcode/
- 悪い例2 : $title = '計画表'; → サーバエラー(文法エラーとなる)
- 悪い例1 : $title = "計画表"; → サーバエラー(文法エラーとなる)
没有评论:
发表评论