2010年11月24日

いわゆる半角カナの文字化けについて

いわゆる半角カナの文字化けについてさらっと調べてみました。

■script_encoding が SJIS のときに文字化けする

mbstring.script_encoding = SJIS の場合、
スクリプトファイルに記載された半角カナが文字化けすることがある。
(この場合、全部じゃなくて一部が文字化けする)

http://blog.y-110.net/log/eid141.html
script_encoding が SJIS の場合, 一旦 EUC に変換されて実行され, 出力時に再度 SJIS に変換されます。
出力は一定のブロックサイズで区切られるのですが,
この際に EUC半角カナの 1バイト目(0x8E)で切られてしまうことがあり, その場合に文字化けが発生していたようです。



■半角カナ2つを入力すると文字化けする

例えば「アイ」という文字が「渦」になる。
これは Shift-JISと EUC-JPが誤判定されているため。
Shift-JISでは「アイ(0xB1 0xB2)」だがEUC-JPでは「渦(0xB1B2)」になる。

http://www.shtml.jp/mojibake/hankaku.html

対策としては、エンコーディング情報(キャラクタセット)を明示すること。



■mb_convert_kana など mbstring関数で文字化けする

$str = mb_convert_kana($str, "KV"); などとしたとき、文字化けする。
これは内部でエンコーディング情報が誤判定されているため。

この場合は第3引数でエンコーディングを明示する。
$str = mb_convert_kana($str, "KV", "SJIS-win");など。
"auto"はやっぱり誤判定することがあるので使わない。



■mb_convert_encoding など mbstring関数で文字化けする

ソ, 十, 申, 能, 表 などの文字で文字化けする。
いわゆる5C問題。



■PHPのバグによる文字化け

 『PHP の mbstring に関するメモ』
 http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_mbstring.html

・PHP 4.3.11, PHP 5.0.0 - PHP 5.0.4
 mb_detect_encoding() が失敗する

・PHP 4.4.0 - PHP 4.4.1, PHP 5.0.4 - PHP 5.0.5
 mb_encode_mimeheader() 関数が正常に動作しない



■メール送信するときに文字化けする

日本語メールの代表的なエンコードである ISO-2022-JP には、
半角カナ(JIS X 0201 Kana)がそもそも含まれていない。なので原則使えない。
(JIS = ISO-2022-JP ではないことに注意)
#自力でMIME変換してsend_mail関数使った方がよさそう。



■MySQLのCONVERT関数のバグにより化ける

MySQL 4.1.2以前のバージョンでCONVERT関数により全角-半角変換すると
半角カナが変換されないことがあるようです。



-----------------------------------------------------------------------------------
メモ


・大勢としてwwwには半角カナを使用しても構わない。
 過去との互換性のためとはいえ、Unicodeでもサポートされているので当面使用に支障はない。

・メールはISO-2022-JPを使用している限り、半角カナは避けるべき。
エンコードが違えば(例えばUTF-8なら)問題ない。

・どちらかというと、半角カナより機種依存文字(NEC特殊文字、IBM拡張文字)の方が厄介。

#『mb_convert_encoding と UTF-8 の誤変換問題』(~波線が化ける)というのもある。
 http://shain.blog.conextivo.com/2007/07/php_mb_convert_encoding_utf8.html
 http://blog.livedoor.jp/dankogai/archives/50488765.html
 この場合、「sjis-win」または「eucjp-win」というエンコーディングを使えば
 回避できることがある。

・半角カナはエンコードによりバイト数が異なる。
  Shift-JIS : 1byte
  EUC-JP : 2byte (先頭1バイトに8Eが入る)
  UTF-8 : 3byte (先頭2バイトにEFBD, EFBE が入る)
  UTF-16 : 2byte
 文字数カウントはシステムにより実装がばらばらなので注意すること。

・PHPの文字化けは基本的に自動変換しようとしたときに起きる。
 よって、出来る限りエンコードを明示することで回避できることが多い。

・「半角カナは化ける」という話は以下の理由が大きい。
 1.メールで使用できない(文字エンコードISO-2022-JPに含まれていないため)
 2.Shift_JISの半角カナは、EUC-JP文字列と区別がつかない。
  またEUC-JPの半角カナと、Shift_JIS文字列とでも区別がつかない。
  よって文字コードの判定ミスが出やすい。






同じカテゴリー(PHP)の記事
 SSHでディレクトリのファイル一覧を取得 (2011-02-18 21:10)
 xhtmlなモバイルサイトで文字化け (2010-12-21 22:57)
 PHPスクリプト終了時に実行する (2010-10-06 19:30)
Posted by とりの からあげ at 17:12 │PHP