Chinaunix

标题: sendmail+mimedefang+mysql,日文系统乱码问题 [打印本页]

作者: 莫糖    时间: 2009-10-14 21:52
标题: sendmail+mimedefang+mysql,日文系统乱码问题
这回是领教了mysql的乱码问题

查看研究了下网上资料
能用的方法都试过了

在代码中添加 “set names XX”
修改mysql的默认字符集
decond,encond
都试过了

在中文系统里是可以实现,无乱码了

但是在当发信端是日文系统的时候
依然是乱码~~

而且发现和mimedefang-filter的编码方式无关,
mail服务器在中文系统的linux上,mysql客户端在另外的中文系统的os上
mysql的客户端,服务器端,能设成utf8的都设成了~~
到底是什么原因导致的乱码呢~~
头晕啊~~

[ 本帖最后由 莫糖 于 2009-10-22 08:17 编辑 ]
作者: abel    时间: 2009-10-21 10:00
不可能自動知道!
那種作業系統有那麼多 MUA/MTA, 所以也很難判斷的出來,除非自己會加一些 X-Tag/X-Header 等給別人認
作者: 莫糖    时间: 2009-10-22 08:18
标题: 回复 #2 abel 的帖子
恩,这个晓得的,就是想加标记,不过这种办法解决乱码失败了,同样的代码在重启mysql后,不能实现无乱码了~~
折磨死我了~~
作者: abel    时间: 2009-10-22 09:06
原帖由 莫糖 于 2009-10-22 08:18 发表
恩,这个晓得的,就是想加标记,不过这种办法解决乱码失败了,同样的代码在重启mysql后,不能实现无乱码了~~
折磨死我了~~

如果您指 $fname 這個變數的編碼,我想您得先知道他的 charset, 或是 mime 中的 language tag 才行
如果是主旨 ($Subject), 則可以從 mime 中的 language tag , Ex: =?GB2312?B?xjdkjdkfjf?= 取得原始編碼,
在以 iconv 做 gb2312 <->utf8 間的轉換 (也可以 mysql>set names XXX 來自動轉碼)
作者: 莫糖    时间: 2009-10-22 13:40
标题: 回复 #4 abel 的帖子
我在mail的信息来源里,找到附件的charset
Content-Type: text/html;
        charset="iso-2022-jp"
.......
Content-Disposition: attachment;
        filename="=?iso-2022-jp?B?TUVMRGFuZHkbJEIlIiE8JSslJCVWNSFHPU14TVElXiVLJWUlIiVrGyhC?=
        =?iso-2022-jp?B?LnR4dA==?="

我在mimedefang里,使用“set names 'iso-2022-jp'”
不起作用~~
还是说我应该想办法在mimedefang里取得
"=?iso-2022-jp?B?TUVMRGFuZHkbJEIlIiE8JSslJCVWNSFHPU14TVElXiVLJWUlIiVrGyhC?==?iso-2022-jp?B?LnR4dA==?="
然后再去转换呢?要怎么取得呢?
作者: renxiao2003    时间: 2009-10-22 17:40
会不会是因为你的邮件的支持问题!
作者: ruochen    时间: 2009-10-22 18:02
统一uft8呢?
作者: 莫糖    时间: 2009-10-23 08:34
标题: 回复 #7 ruochen 的帖子
恩,统一了
能改成utf8的都改了
在mimedefang-filter将取得的附件名转为utf8也不好使~~
作者: 莫糖    时间: 2009-10-23 08:37
标题: 回复 #6 renxiao2003 的帖子
现在就是找不到原因啊~~
所以才苦恼~~
我是在想莫非是日文系统发出的邮件进入中文的邮件服务器时编码就已经出问题,转换出错了~~
作者: abel    时间: 2009-10-26 09:18

  1. $fname"=?iso-2022-jp?B?TUVMRGFuZHkbJEIlIiE8JSslJCVWNSFHPU14TVElXiVLJWUlIiVrGyhC?==?iso-2022-jp?B?LnR4dA==?=";
  2. if ($fname=~/=\?(\S+)\?([BQ])\?\S+\?=) {
  3.    my $lang=$1;
  4.    my $method=$2;
  5.    my $base64=$3;
  6.    if ($method eq "B") { # perl Base64 decode }  # Base64
  7.    if ($method eq "Q") { # Perl QP decode   }   # QP

  8.    # Base64/QP 問題請自己 Google 一下原理,先把 encode 過的東西還原成原始的字,將用那個字的編碼 ($lang) 去做 set names XXX, 或是用 Text::Iconv 轉成 utf8
  9.    
  10.    
复制代码

作者: 莫糖    时间: 2009-10-27 11:44
标题: 回复 #10 abel 的帖子
学习中

真是谢谢您,每次都有新的收获
真是差的太远太远了,有太多太多是我不了解的了~~~

[ 本帖最后由 莫糖 于 2009-10-30 14:17 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2