SquirrelMail日本語パッチとAvelsieve

2010/11/10 by happybreeding Leave a reply »

私は、Sieveを有効したメールサーバを構築したとき、スクリプト編集のユーザインターフェースとして、SquirrelMailAvelsieve pluginを導入することが多い。そして、日本語での文字エンコーディング上の問題を解決するため、SquirrelMailには日本語パッチを当てている。

日本語パッチを当てることで、どのような文字エンコーディングでメールが来たとしても正常に画面表示されるようになるわけだが、副作用として、メール用のエンコーディングとUI用のそれが別になってしまうことがあり、それがAvelsieveと相性がよくない。

Avelsieveは、画面入力された文字をUTF-8に変換して、sieveスクリプトを生成する。これ自体は妥当な仕様なのだが、その際の変換元エンコーディングとして、メール用のエンコーディングを用いる。一方ブラウザからは、UI用のエンコーディングで送られてくるのであるから、そこで食い違いが発生する。

そういう訳で、Avelsieveにも、「日本語パッチ」が必要となってくるので作成した。同様の問題で悩んでいるのであれば、お試しいただきたい。

--- avelsieve/include/DO_Sieve.class.php.orig	2006-07-24 22:48:27.000000000 +0900
+++ avelsieve/include/DO_Sieve.class.php	2010-11-10 12:42:40.000000000 +0900
@@ -76,17 +76,24 @@
     */
     function encode_script($script) {
 	    global $languages, $squirrelmail_language, $default_charset;
+	    global $sm_notAlias;

 	    /* change $default_charset to user's charset */
 	    set_my_charset();

+	    if ($sm_notAlias == 'ja_JP') {
+		$from_charset = 'EUC-JP';
+	    } else {
+		$from_charset = $default_chatset;
+	    }
+
 	    if(strtolower($default_charset) == 'utf-8') {
 		    // No need to convert.
 		    return $script;

         } elseif(function_exists('mb_convert_encoding') && function_exists('sqimap_mb_convert_encoding')) {
 		    // sqimap_mb_convert_encoding() returns '' if mb_convert_encoding() doesn't exist!
-		    $utf8_s = sqimap_mb_convert_encoding($script, 'UTF-8', $default_charset, $default_charset);
+		    $utf8_s = sqimap_mb_convert_encoding($script, 'UTF-8', $from_charset, $default_charset);
 		    if(empty($utf8_s)) {
 			    return $script;
 		    } else {
@@ -99,14 +106,14 @@
 		    if ( stristr($default_charset, 'iso-8859-') ||
 		    stristr($default_charset, 'utf-8') ||
 		    stristr($default_charset, 'iso-2022-jp') ) {
-			    return mb_convert_encoding($script, "UTF-8", $default_charset);
+			    return mb_convert_encoding($script, "UTF-8", $from_charset);
 		    }

 	    } elseif(function_exists('recode_string')) {
-		    return recode_string("$default_charset..UTF-8", $script);
+		    return recode_string("$from_charset..UTF-8", $script);

 	    } elseif(function_exists('iconv')) {
-		    return iconv($default_charset, 'UTF-8', $script);
+		    return iconv($from_charset, 'UTF-8', $script);
 	    }

 	    return $script;
@@ -122,17 +129,24 @@
     function decode_script($script) {

 	    global $languages, $squirrelmail_language, $default_charset;
+	    global $sm_notAlias;

 	    /* change $default_charset to user's charset (THANKS Tomas) */
 	    set_my_charset();

+	    if ($sm_notAlias == 'ja_JP') {
+		$to_charset = 'EUC-JP';
+	    } else {
+		$to_charset = $default_chatset;
+	    }
+
 	    if(strtolower($default_charset) == 'utf-8') {
 		    // No need to convert.
 		    return $script;

 	    } elseif(function_exists('mb_convert_encoding') && function_exists('sqimap_mb_convert_encoding')) {
 		    // sqimap_mb_convert_encoding() returns '' if mb_convert_encoding() doesn't exist!
-		    $un_utf8_s = sqimap_mb_convert_encoding($script, $default_charset, "UTF-8", $default_charset);
+		    $un_utf8_s = sqimap_mb_convert_encoding($script, $to_charset, "UTF-8", $default_charset);
 		    if(empty($un_utf8_s)) {
 			    return $script;
 		    } else {
@@ -145,14 +159,14 @@
 		    if ( stristr($default_charset, 'iso-8859-') ||
 		    stristr($default_charset, 'utf-8') ||
 		    stristr($default_charset, 'iso-2022-jp') ) {
-			    return mb_convert_encoding($script, $default_charset, "UTF-8");
+			    return mb_convert_encoding($script, $to_charset, "UTF-8");
 		    }

 	    } elseif(function_exists('recode_string')) {
-		    return recode_string("UTF-8..$default_charset", $script);
+		    return recode_string("UTF-8..$to_charset", $script);

 	    } elseif(function_exists('iconv')) {
-		    return iconv('UTF-8', $default_charset, $script);
+		    return iconv('UTF-8', $to_charset, $script);
 	    }
 	    return $script;
     }

あと、フォルダ名方面なんとかしないと。

コメントを残す