文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>邮件乱码问题

邮件乱码问题

时间:2006-01-05  来源:ruiqingzheng

找到了 http://netlab.cse.yzu.edu.tw/~statue/freebsd/zh-tut/mail-code.html (郵件亂碼?) 好奇的看了一阵子.... 发现有一个“7bit”的东东, 哈哈, 请看出问题邮件的信头 X-Mailer: osCommerce Mailer
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: 7bit
X-CC-AnitVirus: Version 1.0
  文章有提到base64, 这个我是天天见, 因为每个邮件好像都有这个东东耶..好啦..开始行到..   登录服务器: grep "7bit" * -R   includes/classes/email.php://      $this->build_params['text_encoding'] = '7bit';
includes/classes/email.php: *                            "7bit", "quoted-printable" or "base64" (all without quotes).
includes/classes/email.php: *                            7bit is EXPRESSLY NOT RECOMMENDED. Default is quoted-printable
includes/classes/email.php: *                            "7bit", "quoted-printable" or "base64" (all without quotes).
includes/classes/email.php: *                            Default is 7bit
  看到了吧...$this->build_params['text_encoding'] = '7bit'; 把7bit改成base64, 测试, 哇哈哈, 成功了耶, 脚好了一半^^   看看现在的信头: MIME-Version: 1.0
X-Mailer: osCommerce Mailer
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: base64
X-CC-AnitVirus: Version 1.0
    总结:   一句话: Email 里面的 Encoding 跟 Charset是完全两个不同的概念

---------------------------------------可以说完全看不懂的说------------------------------------

由於歷史原因,Internet 上有些郵件系統只支援 7Bit 的字元傳輸, 而漢字的內碼是 8Bit 的,當在電子郵件中發送中文時, 如果經過這些只支援 7Bit 字元的郵件系統,便會將漢字內碼的第八位元的 1 全部變成 0。

以 "中文" 兩字為例,HEX 為 A4A4A4E5, 當最高位元被清掉時就會變成 24242465,也就是 "$$$e"。 telnet 也存在這樣子的問題。

除了中文郵件外,使用電子郵件傳送圖片、程式、 壓縮文件等也會發生這個問題。所以在電子郵件中一般採用各種郵件編碼方式來解決這個問題, 將 8Bit 按照一定的規則進行編碼,便可以完好地通過只支持 7Bit 字元的郵件系統。

常見的郵件編碼有 UU 與 MIME,而 MIME (Multipurpose Internet Mail Extentions) 一般翻譯成「多媒體傳送模式」, 顧名思義,它標榜的就是可以傳送多媒體型式的檔案,可以在一封mail中附加各種型式檔案一起送出。

MIME 定義兩種編碼方法:Base64 與QP(Quote-Printable), 兩者使用時機不同,QP 的規則是對於資料中的7bits無須重複encode,僅8bits資料轉成7bits。QP編碼適用於非US-ASCII的文字內容,例如中文檔案,而Base64的編碼規則,是將整個檔案重新編碼,編成7bits,它是用於傳送binary檔案時使用。 由於編碼的方式不同,會影響編碼之後的檔案大小。有些較懶惰的軟體便都一律採用Base64編碼了。

含有 MIME 編碼的文件,您查看它的源始碼,一般都含有: "This is a multi-part message in MIME format." 這樣的句子。

以下以 mmencode (又稱為 mimencode) 作為 QP 與 BASE64 的範例, 安裝 converters/mmencode

RFC 2045 - Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies

RFC 2046 - Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types

RFC 2047 - MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text

12.4.1. UU 編碼 (uuencode與uudecode)

UU 是指 Unix 之間傳送二進制文件,就是 Unix to Unix。 使用 uuencode 將檔案編成7位元ASCII檔案,把它寄出, 收信人收到後,可以用 uudecode 將這份資料還原為原來的檔案。

uuencode 的第一個參數是要加碼的檔案,也就是您信件的內容。第二個參數是希望收信人解開後檔案叫什麼名字。

% echo "中文" > infile % uuencode infile remotefile begin 644 remotefile %I*2DY0KQ ` end % uuencode infile remotefile | mail statue % mail Mail version 8.1 6/6/93. Type ? for help. "/var/mail/statue": 1 message 1 new >N 1 statue Fri Dec 21 13:12 16/390 & Message 1: From statue Fri Dec 21 13:12:19 2001 Date: Fri, 21 Dec 2001 13:12:19 +0800 (CST) From: statue <statuei> To: statue begin 644 remotefile %I*2DY0KQ ` end & s mail1 "mail1" [New file] & q % uudecode mail1 % cat remotefile 中文 

12.4.2. QP - Quote-Printable

Content-Transfer-Encoding: quoted-printable

QP編碼的方式,是將一個字元用二個16進位法的數值表示,然後前面再加個「=」字元(等號):

% echo "中文" | mmencode -q =A4=A4=A4=E5 % echo "=A4=A4=A4=E5" | mmencode -q -u 中文 

或是用 perl 來將 QP 解碼:

while(defined($line = <STDIN>)) { $line =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr hex $1/ge; $line =~ s/[ ]+$//; print STDOUT $line; } 

用 perl 來將文字編成 QP 碼:

while(defined($line = <STDIN>)) { $line =~ s/([=x00-x1Fx80-xFF])/sprintf("=%02X",ord($1))/ge; print STDOUT $line; } 

12.4.3. BASE64

Content-Transfer-Encoding: BASE64

BASE64 的算法很簡單,它將字符流順序放入一個 24 位的緩衝區,缺字符的地方補零。然後將緩衝區截斷成 4 個部分,高位在先, 每個部分 6 位,用下面的64個字符重新表示: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"。如果輸入只有一個或兩個字節,那麼輸出將用等號 "=" 補足。還可以隔斷附加的信息造成編碼的混亂。這就是BASE64。

% echo "中文" | mmencode pKSk5Qo= % echo "pKSk5Qo=" | mmencode -u 中文 

12.4.4. 其他亂碼?

以 "中文" 兩字為例,整理一下以上的編碼會出現的狀況:

uuencode:%I*2DY0KQ QP:=A4=A4=A4=E5 BASE64:pKSk5Qo= 

以及其他語言性的轉碼可能出現的狀況:

GB2312:笢恅(iconv -t GB2312) Unicode:U+4E2D U+6587 UCS-2:N-e(iconv -t UCS-2) UTF-7:+Ti1lhw(iconv -t UTF-7) UTF-8:銝剜??(iconv -t UTF-8) UTF-16:??N-e?(iconv -t UTF16) UTF-32:??N-e?(iconv -t UTF32) CNS11643:1-4463 1-4546 CCCII:213034 214258 

另外一些有的沒的程式會出現的狀況:

hexdump:0000000 a4a4 e5a4 000a 0000005(hexdump) 
相关阅读 更多 +
排行榜 更多 +
飞艇大战

飞艇大战

飞行射击 下载
三维空间战斗机

三维空间战斗机

飞行射击 下载
战斗机教练

战斗机教练

飞行射击 下载