特定の文字が化ける


症状

特定の条件で、特定の文字を入力した場合に化ける事があります。また化け方や化ける文字によってそれぞれ原因と対応が異なります

5C文字が原因の場合

  • その文字を記述する位置にかかわらず、特定の文字が化ける。
  • 「表示」をという文字列を表示しようとすると「侮ヲ」と化ける。
  • 「十、表、予、能」などを含むと化けてしまう。(※他にも多数化ける文字は存在します。詳細は5C文字を参考にして下さい。)
原因
  • 2バイト目が「5C」である文字が、「5C」がメタ文字の「\(日本語環境)」と認識されて化ける。
  • よって、2バイト目が「5C」である文字は全て化ける可能性がある。

事例
※ここでは、「表示」という文字を見本にます。
  • 図のように「表」の2バイト目が「5C」と解釈されて取り除かれる。
文字
文字コード(Shift_JIS) 95 5C 8E A6
  • 結果、以下のような文字コードになり表示される。
文字 ヲ(半角)
文字コード(Shift_JIS) 95 8E A6

対応
  • ファイルをEUC-JPの形式で保存する。
  • 問題の文字の後ろに「\(日本語環境)」を追加すると正しく表示される。

追記
  • 色々条件により、EUC-JPの形式での作成が不可能な場合があるので、別の対応も必要。

5C文字とコード
81 5C 83 5C Ы 84 5C 87 5C
89 5C 8A 5C 8B 5C 8C 5C
8D 5C 8E 5C 8F 5C 90 5C
91 5C 92 5C 93 5C 94 5C
95 5C 96 5C 97 5C 98 5C
99 5C 9A 5C 9B 5C 9C 5C
9D 5C 9E 5C 9F 5C E0 5C
E1 5C E2 5C E3 5C E4 5C
E5 5C E6 5C E7 5C E8 5C
E9 5C EA 5C ED 5C EE 5C


文字コード変換を行う際の判定ミス(PHP使用時)の場合

  • 「写」のみを入力した場合に正しく表示されない。
  • 「(別の文字列)写」などは正しく表示される。
  • 「写(別の文字列)」などは正しく表示されない。
  • 「シフ(半角)」を入力すると「写」と表示される。
  • 「松」は入力されない。

発症環境は、PHP・Mojavi(多分この場合の影響としては関係ないと思いますが)使用
流れは、Shift_JIS(入力画面) → EUC-JP → Shift_JIS(入力画面)

また調べている時に分かったことですが、jcode.plでもバージョンによってこのエラーが発生するみたいです(同じ症状という意味で)

原因
最初のエンコード(Shift_JIS(入力画面) → EUC-JP)を行う際に記述のコード
$str = mb_convert_encoding($str, "EUC-JP", "auto");
上記を記述することによって、$str を EUC-JP に変換できます。
通常は"auto" を指定すると 元の文字コードを自動検出して変換を行います。
しかし、この場合に問題となったのは、なんらかの原因で正しく自動検出が出来なかった為に、正しく変換が行われなかった為に文字化けが発生したと思われます。

対応
  • autoは使用せず、(この場合はShift_JIS)厳密に記述する。

文字コードの特定

使用している文字コードや、表示している文字コードが不明の場合は次の方法で確認する事が可能です。

  • ブラウザ上(表示)
表示→エンコード

  • プログラム上(PHP使用時)
string i18n_discover_encoding(string str[,string lang])
を記述すると文字列の文字コードが返ってきます。
最終更新:2006年03月14日 15:39