08 October '2003 - 20:44 | 雑記 文字化け
SquirrelMail を使っていて、生データは問題ないのに、なぜか文字化けすることがあったので調べてみたら、PHP の mb_detect_encoding() が間違った検出をしてしまう場合があることが原因だった。うーむ、こんなのが間違うことがあるとは。
もしかしたら、それが依存しているライブラリのバグだったりするのかも知れないけれど、そこまで追う気力も体力も時間もない。
なので、素直にメーラが言ってる文字セットを使えばいいじゃん、ということにした。
$ diff -u mime.php.orig mime.php
--- mime.php.orig Fri Jul 18 05:46:16 2003
+++ mime.php Fri Sep 5 00:04:49 2003
@@ -347,7 +347,25 @@
if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
- if (mb_detect_encoding($body) != 'ASCII') {
+
+ /* why don't we just depend on the charset specified by mailers
+ * rather than mb_detect_encoding() which does not always detect
+ * encoding as we expect?
+ */
+ $charset = strtolower($body_message->header->parameters['charset']);
+ if ($charset != 'us-ascii' && $charset != 'iso-8859-1') {
+ if ($charset == 'iso-2022-jp') {
+ $encoding = 'JIS';
+ } else if ($charset == 'euc-jp') {
+ $encoding = 'EUC';
+ } else if ($charset == 'shift_jis') {
+ $encoding = 'SJIS';
+ } else if ($charset == 'utf-8') {
+ $encoding = 'UTF-8';
+ } else {
+ $encoding = 'AUTO';
+ }
+ $body = mb_convert_encoding($body, 'EUC-JP', $encoding);
$body = $languages[$squirrelmail_language]['XTRA_CODE']('decode', $body);
}
}
ほんとは、i18n.php の japanese_charset_xtra() に charset を渡す方がいいんだけれど、実行効率よりも保守効率を選んだ。つまり、パッチが二箇所になるのは面倒なんで、mime.php だけハックすることにした。
オープンソースマンセー。
早速、お知恵を拝借いたします。
ありがとう。
tokyoblog - 25 August '2005 - 05:44