Squirrelmailの文字化けについて

Debianのパッケージを使ってSquirrelmailをインストールしました。Debianは、sargeでSquirrelmailのバージョンは、1.4.4です。このときに起こった文字化けの対処方法をまとめました。

発生した文字化けの内容は、つぎのとおりです。

  • 本文内の文字
  • 日本語を含む添付ファイル名

とくに、添付ファイル名については、送信時に表示が正常であるにもかかわらず、受信側で文字化けしていました。何とかしないとと思い、ネット上を検索しました。結果、以下のソース修正で対応可能でした。

ただし、表面的には文字化けしていないのですが、添付ファイル名のリンク部分がうまく行っていないような。リンク部分をクリックすると、ExcelファイルなのにIE上で開いてしまったりします。(Excelが開くのではなく、IE上に無理やりExcelを表示しています。)この問題については、現在調査中?です。(あんまり実害はないので・・・。)

スポンサーリンク




本文内の文字化け対応

修正対象のファイルは、「/usr/share/squirrelmail/functions/i18n.php」です。以下は、diffの結果です。

kuroboxfo:~# diff -c /usr/share/squirrelmail/functions/i18n.php.original /usr/share/squirrelmail/functions/i18n.php
*** /usr/share/squirrelmail/functions/i18n.php.original 2007-06-25 18:19:17.000000000 +0900
--- /usr/share/squirrelmail/functions/i18n.php  2007-06-25 18:42:12.000000000 +0900
***************
*** 346,352 ****
                  $detect_encoding == 'SJIS' ||
                  $detect_encoding == 'UTF-8') {

!                 $ret = mb_convert_kana(mb_convert_encoding($ret, 'EUC-JP', 'AUTO'), "KV");
              }
              break;
          case 'encode':
--- 346,353 ----
                  $detect_encoding == 'SJIS' ||
                  $detect_encoding == 'UTF-8') {

! //                $ret = mb_convert_kana(mb_convert_encoding($ret, 'EUC-JP', 'AUTO'), "KV");
!                 $ret = mb_convert_kana(mb_convert_encoding($ret, 'EUC-JP', 'ASCII,JIS,EUC-JP,UTF-8,SJIS'), "KV");
              }
              break;
          case 'encode':
***************
*** 356,362 ****
                  $detect_encoding == 'SJIS' ||
                  $detect_encoding == 'UTF-8') {

!                 $ret = mb_convert_encoding(mb_convert_kana($ret, "KV"), 'JIS', 'AUTO');
              }
              break;
          case 'strimwidth':
--- 357,364 ----
                  $detect_encoding == 'SJIS' ||
                  $detect_encoding == 'UTF-8') {

! //                $ret = mb_convert_encoding(mb_convert_kana($ret, "KV"), 'JIS', 'AUTO');
!                 $ret = mb_convert_encoding(mb_convert_kana($ret, "KV"), 'JIS', 'ASCII,JIS,EUC-JP,UTF-8,SJIS');
              }
              break;
          case 'strimwidth':
***************
*** 365,411 ****
              break;
          case 'encodeheader':
              $result = '';
!             if (strlen($ret) > 0) {
!                 $tmpstr = mb_substr($ret, 0, 1);
!                 $prevcsize = strlen($tmpstr);
!                 for ($i = 1; $i < mb_strlen($ret); $i++) {
!                     $tmp = mb_substr($ret, $i, 1);
!                     if (strlen($tmp) == $prevcsize) {
!                         $tmpstr .= $tmp;
!                     } else {
!                         if ($prevcsize == 1) {
!                             $result .= $tmpstr;
!                         } else {
!                             $result .= str_replace(' ', '',
!                                                    mb_encode_mimeheader($tmpstr,'iso-2022-jp','B',''));
!                         }
!                         $tmpstr = $tmp;
!                         $prevcsize = strlen($tmp);
!                     }
!                 }
!                 if (strlen($tmpstr)) {
!                     if (strlen(mb_substr($tmpstr, 0, 1)) == 1)
!                         $result .= $tmpstr;
!                     else
!                         $result .= str_replace(' ', '',
!                                                mb_encode_mimeheader($tmpstr,'iso-2022-jp','B',''));
                  }
              }
!             $ret = $result;
              break;
          case 'decodeheader':
              $ret = str_replace("\t", "", $ret);
              if (eregi('=\\?([^?]+)\\?(q|b)\\?([^?]+)\\?=', $ret))
                  $ret = @mb_decode_mimeheader($ret);
!             $ret = @mb_convert_encoding($ret, 'EUC-JP', 'AUTO')
              break;
          case 'downloadfilename':
              $useragent = func_get_arg(2);
              if (strstr($useragent, 'Windows') !== false ||
                  strstr($useragent, 'Mac_') !== false) {
!                 $ret = mb_convert_encoding($ret, 'SJIS', 'AUTO');
              } else {
!                 $ret = mb_convert_encoding($ret, 'EUC-JP', 'AUTO');
  }
              break;
          case 'wordwrap':
--- 367,420 ----
              break;
          case 'encodeheader':
              $result = '';
! //            if (strlen($ret) > 0) {
! //                $tmpstr = mb_substr($ret, 0, 1);
! //                $prevcsize = strlen($tmpstr);
! //                for ($i = 1; $i < mb_strlen($ret); $i++) {
! //                    $tmp = mb_substr($ret, $i, 1);
! //                    if (strlen($tmp) == $prevcsize) {
! //                        $tmpstr .= $tmp;
! //                    } else {
! //                        if ($prevcsize == 1) {
! //                            $result .= $tmpstr;
! //                        } else {
! //                            $result .= str_replace(' ', '',
! //                                                   mb_encode_mimeheader($tmpstr,'iso-2022-jp','B',''));
! //                        }
! //                        $tmpstr = $tmp;
! //                        $prevcsize = strlen($tmp);
! //                    }
! //                }
! //                if (strlen($tmpstr)) {
! //                    if (strlen(mb_substr($tmpstr, 0, 1)) == 1)
! //                        $result .= $tmpstr;
! //                    else
! //                        $result .= str_replace(' ', '',
! //                                               mb_encode_mimeheader($tmpstr,'iso-2022-jp','B',''));
!             if (@mb_detect_encoding($ret) != 'ASCII') {
!                 if (preg_match('/^([[:print:]]+)(.*)/', $ret, $regs)) {
!                   $ret = $regs[1] . mb_encode_mimeheader($regs[2], 'iso-2022-jp', 'B', '');
!                 } else {
!                   $ret = mb_encode_mimeheader($ret, 'iso-2022-jp', 'B', '');
                  }
              }
! //            $ret = $result;
              break;
          case 'decodeheader':
              $ret = str_replace("\t", "", $ret);
              if (eregi('=\\?([^?]+)\\?(q|b)\\?([^?]+)\\?=', $ret))
                  $ret = @mb_decode_mimeheader($ret);
!             $ret = @mb_convert_encoding($ret, 'EUC-JP', 'ASCII,JIS,EUC-JP,UTF-8,SJIS');
              break;
          case 'downloadfilename':
              $useragent = func_get_arg(2);
              if (strstr($useragent, 'Windows') !== false ||
                  strstr($useragent, 'Mac_') !== false) {
! //                $ret = mb_convert_encoding($ret, 'SJIS', 'ASCII,JIS,EUC-JP,UTF-8,SJIS');
!                 $ret = mb_convert_encoding($ret, 'UTF-8', 'ASCII,JIS,EUC-JP,UTF-8,SJIS');
              } else {
! //                $ret = mb_convert_encoding($ret, 'EUC-JP', 'AUTO');
!                 $ret = mb_convert_encoding($ret, 'EUC-JP', 'ASCII,JIS,EUC-JP,UTF-8,SJIS');
  }
              break;
          case 'wordwrap':

日本語を含む添付ファイル名の文字化け

修正対象のファイルは、「/usr/share/squirrelmail/src/compose.php」です。以下は、diffの結果です。

kuroboxfo:~# diff -c /usr/share/squirrelmail/src/compose.php.original /usr/share/squirrelmail/src/compose.php
*** /usr/share/squirrelmail/src/compose.php.original    2007-05-14 11:13:12.000000000 +0900
--- /usr/share/squirrelmail/src/compose.php     2007-06-25 18:35:17.000000000 +0900
***************
*** 807,813 ****
              $filename = decodeHeader($filename, false, false);
              if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
                      function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
!                 $filename =  $languages[$squirrelmail_language]['XTRA_CODE']('encode', $filename);
              }
              $localfilename = GenerateRandomString(32, '', 7);
              $full_localfilename = "$hashed_attachment_dir/$localfilename";
--- 807,814 ----
              $filename = decodeHeader($filename, false, false);
              if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
                      function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
! //                $filename =  $languages[$squirrelmail_language]['XTRA_CODE']('encode', $filename);
!                 $filename =  $languages[$squirrelmail_language]['XTRA_CODE']('dencode', $filename);
              }
              $localfilename = GenerateRandomString(32, '', 7);
              $full_localfilename = "$hashed_attachment_dir/$localfilename";
スポンサーリンク







シェアする

  • このエントリーをはてなブックマークに追加

フォローする