你用的什么版本,好像没有这两个函数,utf-7我不太清除,不知道和mime有什么区别,如果没有区别的话,可能下面的对你有用:解码mime邮件的代码 
function decode_mime_string ($string) {
$pos = strpos($string, '=?');
if (!is_int($pos)) {
return $string;
}$preceding = substr($string, 0, $pos); // save any preceding text$search = substr($string, $pos+2, 75); /* the mime header spec says this is the longest a single encoded word can be */
$d1 = strpos($search, '?');
if (!is_int($d1)) {
return $string;
}$charset = substr($string, $pos+2, $d1);
$search = substr($search, $d1+1);$d2 = strpos($search, '?');
if (!is_int($d2)) {
return $string;
}$encoding = substr($search, 0, $d2);
$search = substr($search, $d2+1);$end = strpos($search, '?=');
if (!is_int($end)) {
return $string;
}$encoded_text = substr($search, 0, $end);
$rest = substr($string, (strlen($preceding . $charset . $encoding . $encoded_text)+6));switch ($encoding) {
case 'Q':
case 'q':
$encoded_text = str_replace('_', '%20', $encoded_text);
$encoded_text = str_replace('=', '%', $encoded_text);
$decoded = urldecode($encoded_text);if (strtolower($charset) == 'windows-1251') {
$decoded = convert_cyr_string($decoded, 'w', 'k');
}
break;case 'B':
case 'b':
$decoded = urldecode(base64_decode($encoded_text));if (strtolower($charset) == 'windows-1251') {
$decoded = convert_cyr_string($decoded, 'w', 'k');
}
break;default:
$decoded = '=?' . $charset . '?' . $encoding . '?' . $encoded_text . '?=';
break;
}return $preceding . $decoded . decode_mime_string($rest);
} // decode_mime_string()

解决方案 »

  1.   

    非常抱歉,我虽然没有做过这方面的试验,但是下面的可能对你有点启发,如果成功了,别忘了告诉我,谢谢!
    -------------------------------------------
    Internet E-mail的编码与解码   
          来源:网际空间杂志 
       
      Internet E-mail的编码与解码■前言  有人说,Internet是个无远弗届的世界,尤其是E-mail的传递,可让您的讯息迅速地传送到收件人手中,大量减少了一般邮件所必须花费的费用及时间。的确,E-mail的使用几乎是所有网路人的必要项目,在E-mail的使用上,更早已跨越了只能传送文字的限制,不但可以传送8bits的中文字,还可用attach档案的方式传送一些非文字的档案,它的使用可说是日益普及。但许多人仍会疑惑,非文字的「档案」怎麽传送?又为什麽常常会有人收到一堆乱七八糟的「乱码」呢?本文撰写的方式,将尽量以浅显易懂的叙述,说明这些mail如何的传送、如何的顺利解读,让您不再「望天书而兴叹」!本文并将着重於「如何解码」,对於编码的原理及方式则不多赘述,因为对於一般使用者而言,原理并不重要,能够顺利读到亲朋好友的来信才是最重要的吧! ■为什麽要编码  在Internet里,E-mail的传送是只能传送US-ASCII格式的文字讯息,ASCII是7位元码,而非ASCII格式的档案,在传送过程中若不先经过编码,先编成7位元码再传送,则在传送过程中会因为这7位元的限制而遭到拆解,拆解之後只会让收信方看到一堆乱七八糟不知所云的东西。经过编码後的资料,在传送过程中可顺利传送,不会有「被截掉一个bit」的危险,但是收信方必须具有解码的程式,将这份经过编码的东西还原,才能解读「天书」,看到寄信人要传送的讯息是什麽。  尤其有一点要注意的是,大部份的人普遍会有「文字档不需要编码」的观念,但我们的中文是属於8位元的文字,它并不是标准的ASCII格式,由於在台湾中文是通行的文字,所以台湾的mail server都已能够处理BIG-5中文码,因而的确是不需要做这种编码、解码的动作,可以直接传送。但如果要送中文信到国外,还是需要经过这种手续才能传送,因为外国的mail server是无法辨认中文码的。中文码在经过一些未支援中文码的传递主机时,依然会被截掉一个bit,造成支离破碎无法读取的惨剧。而经过编码的中文信,收信人收到後,将档案解码还原,也是需要有中文系统才能看您写的中文信。笔者常与几位赴海外留学的同学们通信,未免得英文能力表达能力不佳,也是习惯用中文来写mail,只是他们必须在自己的PC上先安装上中文windows,才能顺利使用中文来沟通哩!在此也顺便提醒读者们,若准备出国留学,建议您带着一套中文系统出去,国外可不容易买到中文软体唷! ■UU编码(uuencode与uudecode)  uuencode原来是unix上用的一种编码程式,後来有人改写成为在DOS亦可执行的程式,而在图形介面的windows系统逐渐成为主流之时,自然这种功能也被运用在windows软体上。在早期要传送非US-ASCII型式的资料,最常用的便是这种UU编码(Unix-to-Unix encoding)方式。执行的方法,在DOS之下是先使用一种uuencode.exe的程式将档案编成7位元ASCII档案,把它寄出,收信人收到後,可以用uudecode.exe的程式将这份资料还原为原来的档案。而windows的程式则通常是用一个软体便可执行uuencode 及uudecode的功能了。  笔者在此对於UU编码的示范说明,便是以DOS之下的uuencode、uudecode程式以及在windows之下的wincode软体来做一范例。以上这些程式均属於shareware,可在各大Ftp Server找到,读者朋友可使用网路上的archie功能来寻找及取得,至於取得的方法,本文中不再多作介绍。  自ftp server取得uuencode及uudecode二支DOS程式後,我们可试着将要传送的档案做一编码。假设我们有这样子的一段话,以中文Big5码写成的: 「大家好!我是梁孟君,很高兴有机会在此向大家自我介绍,希望有缘与您做朋友。」 这一段文字您可能是使用某些文字编辑软体写成,例如以PE2打完这段文字後,以「myself」为档名存档。uuencode及uudecode的使用方式如下: uuencode file_1 file_2 ==>file_1为原始档案之档名
                 file_2为编码後之档名(可自取一个档名) 如果您不预设这个file_2档名,它内定会产生一个名为file_1.uue的档案,接着可将file_2寄出(编好後的file_2看起来是一堆乱码)。 收信方收到後存档,档名取为file_3,再使用uudecode.exe解码:uudecode file_3,这时会产生一个和原先一模一样的file_1 我们以上例的「myself」来看编码的结果: uuencode myself,按下enter键後,我们可以看到在磁碟里多出了一个myself.uue的档案,用文书软体叫出这个myself.uue後,内容如下: section 1 of uuencode 5.21 of file myself  by R.E.M. begin 644 myself
    MI&JN8:9NH4FGVJQ/L>>I<Z=GH4&KW+"JO[.FL[[WMWRF8J:YIE:D:JYAIMN
    G=VJ2VLM"A0:?&#0JQYJ:SO72[4+%ZL+6J0J3-H4/-4
    `
    end
    sum -r/size 32014/129 section (from "begin" to "end")
    sum -r/size 43769/74 entire input file
     其中第一行的「section 1 of uuencode 5.21 of file myself  by R.E.M.」以及最後二行「sum -r/size 32014/129 section (from "begin" to "end")」「sum -r/size 43769/74 entire input file」只是这个软体的设计者的加注说明,不是很重要,最重要的是在「begin 644 myself」与「end」之间的文字,那就是我们原文编码後所呈现的模样。您可以把它copy到您的E-mail软体中,加上收信人的E-mail address就可以把它寄出了。要注意的是您必须让这一行「begin 644 myself」与「end」以及它们之间所有的文字都完整的出现在您的mail中,对方使用uudecode时才能根据其「begin」、「end」自动抓取内文而还原第一行「begin 644」之後的档名,也就是我们原来的那个档案。  假设我是收信人,我收到的mail内文如下: >From [email protected] Mon Sep 2 01:10:20 1996
    Return-Path: <[email protected]>
    X-Sender: [email protected] (Unverified)
    Date: Mon, 02 Sep 1996 01:08:36 +0800
    To: [email protected]
    From: Maggie Liang <[email protected]>
    Subject: test uuencodeThis is a test mail, it's encoded by uuencode.exe.
    Please use uudecode.exe to decode it.begin 644 myself
    MI&JN8:9NH4FGVJQ/L>>I<Z=GH4&KW+"JO[.FL[[WMWRF8J:YIE:D:JYAIMN
    G=VJ2VLM"A0:?&#0JQYJ:SO72[4+%ZL+6J0J3-H4/-
    `
    end
     我只要将这个mail存档,例如我可以将之存成test.txt,然後以uudecode test.txt的指令去还原,我就可以看到原来那篇文字「大家好!我是梁孟君,很高兴有机会在此向大家自我介绍,希望有缘与您做朋友。」  上述是以DOS之下的程式去做这个动作,事实上有许多windows的软体也有这种功能,下面将介绍wincode的使用。既然都是执行uuencode、uudecode,原理上和DOS程式没什麽两样,只是在windows的介面下,操作是更为简便。wincode这套软体除支援UU编码之外,也支援MIME、BINHEX等编码格式,应用范围颇为广泛,因而笔者在此推荐给读者朋友们。wincode在一般ftp server的档名是wncod266.zip,其「266」指的是版本别,您可能找到的是wncod260.zip或是其它版本,截至笔者完稿之时,所看到最新的版本是266,但即使您寻找到的是较旧的版本,其功能上的差异不大,各位读者仍可使用它来操作本文所介绍的功能。  wincode在解压缩并安装完成後,我们可以执行其主程式,在进入主画面之後,可先点选功能表中的「Options」,设定您需要的项目。在此例中,我们要执行uuencode及uudecode,可在「Options」中的「Configuration」设定encode及decode的code type,选择UUE,即是采行UU编码。   主功能表中的「File」选项,则让您选择是要encode还是要decode。选择encode後,它会寻问您Input file,并出现树状目录让您选择。点选之後,则出现一行「Enter a VALID DOS filename」,请您输入encode後要将档案存成何种档名,其内定值即是将您的原来档名加上UUE的副档名。而进行decode时,也只要在「File」中选择decode,即出现树状目录让您选择您要decode的档案,点选之後同样出现「Enter a VALID DOS filename」,请您输入要存档的档名。一般会根据其原文中第一行「begin 644 filename」中的filename做为预设值,您也可以更改它,另存新档。uuencode在编码时,会在这第一行自动记录原来未编码时的档名。  有些mail软体内附有decode的功能,在收到这种uuencode编码的mail,可直接在mail软体中解码,例如Winspan的mailer。您可以在收到mail後,在「收信邮箱」中点选您要decode的那封mail,然後选择功能表的「讯息」,点选「UUDECODE」,即可decode这个档案。  以上介绍的UU编码,并非只能编中文文字,任何您要寄送的档案,例如exe档,都可以先编码再寄送,收信方解码还原即可得到您寄给他的档案。 ■MIME(Multipurpose Internet Mail Extentions)  UU编码解决了mail只能传送ASCII档案的问题,但这种方式其实并不是很方便,而後又发展出一种称之为MIME的编码规格,其全名是Multipurpose Internet Mail Extentions,一般翻译成「多媒体传送模式」。顾名思义,它标榜的就是可以传送多媒体型式的档案,可以在一封mail中附加各种型式档案一起送出。  在MIME的规格订定出来後,MIME已成为Internet E-mail的主流,它的好处是以物件包装方式,可将多种不同档案一起打包再传送,送信人只要将档案选好,它在传送时即时编码,收信人的软体收到也是即时解码还原,完全自动化,是非常方便的一种传送方式。当然先决条件是双方的软体都必须具有这种功能,要不然送信人很方便的把信送出去了,但收信人的软体如果没有这种功能,无法把它还原,他看到的也就是一大堆乱码了!使用这种方式,user根本不需要知道它是如何编码、解码的,如果只是用文字写写信,一样是打好字便寄出,如果是要寄档案,只要做选档案的动作,选完寄出,其馀的工作您的mail软体会帮您做。由於MIME的方便,愈来愈多mail软体采用这种方式,例如Acacia Mail、Eudora、Microsoft Exchange等等。   虽说在使用MIME这种编码规格时,user是可以不用知道如何编码,只要具有这种支援MIME的E-mail软体即可收发自如,但本文仍对於它的编码方式略作说明,以防万一您的E-mail软体并不支援MIME,您在收到这种「天书」时,还能够有办法解读天书。   MIME定义的是一种规格,也可以说是一种统称,其实能够符合这种规格的编码方式并不是单一的一种,只要符合这种MIME规格便可顺传送。以货运作为比喻,若货运公司规定送交货运的规格是一公尺见方的箱子便可托运,您只要使用一公尺见方的货运箱,它并没有限制一定要用木板钉成的箱子或是铁皮箱,只要是一公尺见方,货运公司就帮您送达。而至於箱子里您是要装食品或是书本或是衣服或是混合着装也没有限定,也就是说内容可以多种型态的档案一起寄送。  就上例而言,「一公尺见方」是货运规格,也就是我们的MIME规格;木箱或铁皮箱是编码方式,现在我们就来看看您有哪些箱子种类可以选择!MIME 定义两种编码方法:Base64 与QP(Quote-Printable),两者使用时机不同,QP的规则是对於资料中的7bits无须重复encode,仅8bits资料转成7bits。QP编码适用於非US-ASCII的文字内容,例如我们的中文档案,而Base64的编码规则,是将整个档案重新编码,编成7bits,它是用於传送binary档案时使用。由於编码的方式不同,会影响编码之後的档案大小。一般在具有MIME 功能的E-mail软体中会自动判别您的mail内容,自动选择是要使用QP或是Base64,有些较懒惰的软体便都一律采用Base64编码了。  QP编码的方式,是将一个字元用二个16进位法的数值表示,然後前面再加个「=」字元(等号),所以我们看到经过QP编码後的文字是这个样子: =A4j=AEa=A6n=A1I=A7=DA=ACO=B1=E7=A9s=A7g=A1A=AB=DC=B0=AA=BF=B3=A6=B3=BE=F7=
    =B7|=A6b=A6=B9=A6V=A4j=AEa=A6=DB=A7=DA=A4=B6=B2=D0=A1A=A7=C6=B1=E6=A6=B3=BDt=
    BBP=B1z=B0=B5=AAB=A4=CD=A1C 这就是我们前面的例子中,「myself」这个档案经过QP编码後的模样,您是否真觉得它像是「天书」呢?我们可以再看看「myself」经过Base64之後又是什麽德性呢? pGquYaZuoUmn2qxPseepc6dnoUGr3LCqv7Oms773t3ymYqa5plakaq5hptun2qS2stChQafGDQ
    qx5qazvXS7ULF6sLWqQqTNoUM= 上段文字便是我们的「myself」经过Base64後的结果。收信方如何去判定要以 QP或是Base64去解码呢?我们可以看一下这封mail范例: >From [email protected] Mon Sep 2 11:57:11 1996
    Return-Path: <[email protected]>
    Received: from maggie.seed.net.tw ([139.175.49.16]) by iii.org.tw (4.1/SMI-4.1)     id AA29902; Mon, 2 Sep 96 11:57:03 CST
    Message-Id: <[email protected]>
    X-Sender: [email protected]
    X-Mailer: Windows Eudora Light Version 1.5.4 (32)
    Mime-Version: 1.0
    Content-Type: multipart/mixed; 
    boundary="=====================_841608510==_"
    Date: Mon, 02 Sep 1996 12:08:30 +0800
    To: [email protected]
    From: Maggie Liang <[email protected]>
    Subject: Test MIME mail!
    X-Attachments: C:\code\mimeqp\Mimeqp.exe;
    Status: R
    --=====================_841608510==_
    Content-Type: text/plain; charset="iso-8859-1"
    Content-Transfer-Encoding: quoted-printable=B3o=A4@=AB=CAmail=A1A=ACO=ADn=B4=FA=B8=D5MIME=AA=BA=A5\=AF=E0=A1A=A8=C3=AA=
    =FE=B1H=A4@=AD=D3binary=C0=C9=AE=D7mimeqp.exe=A1C 
    --=====================_841607721==_
    Content-Type: application/octet-stream; name="Mimeqp.exe"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="Mimeqp.exe"TVoQABYAAQAgAAAA//95AoAAAAAAAAAAIgAAAAEA+yByagEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    (因编码後文件太长,以下之base64码省略)我们可以很清楚地看到,这一封送出去的mail中,其head中已很清楚地定义这是遵循MIME ver1.0的规格,并且前面一段的文字定义「Content-Transfer-Encoding: quoted-printable」是用QP编码,後面附寄的binary档案,则在这几行中也交待清楚:
    Content-Type: application/octet-stream; name="Mimeqp.exe"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="Mimeqp.exe"
    是要寄一个名为mimeqp.exe的档案,并且已经用Base64编过码了。
      其实这些讯息都是我的Eudora软体在送信时自动完成编码、加注、寄出等动作,我只在信件中写下这些字「这一封mail,是要测试MIME的功能,并附寄一个binary档案mimeqp.exe。」然後选择我的attach档案,Eudora在把信件送出时自动转换变成了上面那些文字与符号,将这些讯息送到了mail server,经由mail server的传递送到了收信人的mail server。而收信人在收信时,如果他也用这种支援MIME格式的软体来收信,那麽他的软体在读取mailserver送过来的讯息时,会自动再翻译回来「这一封mail,是要测试MIME的功能,并附寄一个binary档案mimeqp.exe。」而且把这个附寄的mimeqp.exe档案存在他的硬碟里,他收到的是一段完整的文字,以及一个完整的档案,而不是有如天书般的乱码。   如果很不幸地,收信人没有这种支援MIME的软体,他看到的东西就是我们上面那些一大段的符号了。另外,上封mail笔者是为了测试QP编码,所以在文字部份也指定编码,因而形成「=B3o=A4@=AB=CAmail=A1A」这样子的符号,但如同本文一开始所述,事实上在台湾的mail server都能够处理中文码,中文码可以不用编码就寄出。如果把QP编码的功能取消,亦即文字部份不先编码而直接寄出,则这位没有MIME软体的收信人是可以看到完整的原文的。   这位不幸地收信人如果恰好是您,别急,您仍然可以先将这份天书存档,然後使用一些decode软体把它翻译回来的。但目前笔者尚未找到可以同时处理QP与Base64的解码软体,若您收到含有QP码又有Base64码的mail,可能只得分二次处理了。   在Base64码的部份,您可以使用前文所介绍之wincode软体来执行decode工作,只要将decode type设为Base64即可,方式如同UU码。可惜的是wincode并没有支援QP码。   笔者在此另外再介绍一个於DOS下执行的程式:base64.zip。读者们可用archie寻找ftp server中是否有这个程式。这个压缩档解压缩後会产生encode64.exe与decode64.exe二个档以及其说明档base64.doc。使用方法非常简单,举例而言,若要将一个名为test.com的档案编码,只要以下列指令: encode64 test.com 按下enter之後,它会自动产生test.64这个档案,其内容便是test.com的base64编码。如欲解码,亦只要以下列指令: decode64 test.64 便可以把该档案还原。因此倘若您没有可支援MIME的mail软体,您只要将收到的mail先存档,例如存成一个名为「myfile」的档案,然後去执行decode功能,不论您用的是wincode或是decode64,它会依据这一行的记录,把档案还原回来的档名(在"name="之後的档名)。 Content-Type: application/octet-stream; name="test.com"   至於QP编码,笔者尚未找到适合的windows软体,因而在此介绍的是二支DOS程式:cvnt_qp与mimeqp。同样地,我们可以在ftp server找到这二支程式,其档名分别是cnvt_qp.zip与mimeqp.zip。其使用方法与前面所介绍的base64差不多。   cnvt_qp在解压缩之後,会产生cnvt_qp.exe,除了一个说明档qp.doc外,作者尚附上其C语言写成的原始程式码,cnvt_qp.c,有兴趣的读者可自行参考这支程式的设计。使用上,执行cnvt_qp.exe後,会出现一简单的功能表,让您选择是要将8bits文字档encode成QP码,或是将QP码decode成一般文字档。选择您需要的项目後,只要再输入您要encode或decode的档名即可。   mimeqp的使用也相当简便,其指令如下,亦可以mimeqp -? 来看其说明:   mimeqp -e filename ? 将档案编码(encode)
      mimeqp -d filename ? 将档案解码(decode) ■ Binhex编码   Binhex的编码方式较常用於Mac机器,在PC上是较少使用的一种编码方式。一般PC上的mail软体,亦多数支援MIME的规格,少有支援Binhex格式。在笔者常用的mail软体中,唯Eudora具有这种功能,可直接解读Binhex之编码。如果您收到了这种由Binhex所编码的mail,而且您的mail软体并不是Eudora 或其他有支援Binhex格式的软体,那怎麽办呢?别急,我们这儿也介绍一个解读Binhex的程式给您!   这也是一个shareware,您可以在一些ftp server找到的,档名是binhex13.exe,它是一个在DOS之下执行的程式。同样地,先把您收到的「天书」存档,然後在DOS下执行这个binhex13.exe。执行後它会出现一个简易视窗,萤幕最下方则是功能表。我们可以看到其F1是help、F2是「Bin2Hex」,也就是把binary档案转换成Binhex码;而F3是「Hex2Bin」,也就是把Binhex码还原成binary档案。因此您可以按下键盘上的功能键F3,然後它会出现一个小对话视窗,让您选择您要解码的档案,这时选取刚刚您把mail存下来的档案,按下enter键,您会看到萤幕上出现「filename successfulely converted」,它已经帮您把档案解码还原啦!   在windows之下,您还可以用我们前面所介绍的wincode来解码,看到这儿,您是不是要赞叹wincode的功能真是强大,本文介绍的UU编码、MIME、Binhex居然都可以用它来处理!是的,它是一个不错的编码、解码软体,可处理多种格式之编码方式。稍微可惜的是对於MIME,它只处理base64之编码,如果能再加上QP的功能,您真的可以靠它走遍天下了! ■ 结语   经由本文的介绍说明,相信各位读者已对於各种编码方式具相当的了解,您是否觉得它其实一点也不困难呢?虽然好像有点复杂,但其实在MIME几乎已成标准规格的现在,用一套支援MIME的软体来做收发E-mail的工作,这些编码、解码是不劳您去伤脑筋的。不要觉得很麻烦,想想看如果您有位远方的朋友过生日,您亲自用绘图软体画了一张精美贺卡,还用音效程式录下您美妙的歌声唱着生日快乐歌,然後用E-mail在一瞬间传送到他那儿,是多麽温馨感人呀!如果您正是那位令人 慕的寿星,偏偏您又没有适当的mail软体来收取这份祝福,那怎麽办呢?相信阅读本文後,必定不再让您感到遗憾,任何的祝福您都不会错过。
    -------------------------------------------
      

  2.   

    对不起,我只有utf-8的,你看看是否有用以下是一段gb2312 -> UTF-8 的函数,西西,我抄了
    unicode -> UTF-8 的算法,所以实际比GB2312->unicode
    没多多少东西,请注意调用gb2utf8()时不能中英文混用程序需要的GB2312.txt文件gb2utf8.php
    <?//Program writen by sadly www.phpx.comfunction gb2utf8($gb)
    {
    if(!trim($gb))
    return $gb;
    $filename="gb2312.txt";
    $tmp=file($filename);
    $codetable=array();
    while(list($key,$value)=each($tmp))
    $codetable[hexdec(substr($value,0,6))]=substr($value,7,6);$utf8="";
    while($gb)
    {
    if (ord(substr($gb,0,1))>127)
    {
    $this=substr($gb,0,2);
    $gb=substr($gb,2,strlen($gb));
    $utf8.=u2utf8(hexdec($codetable[hexdec(bin2hex($this))-0x8080]));
    }
    else
    {
    $gb=substr($gb,1,strlen($gb));
    $utf8.=u2utf8(substr($gb,0,1));
    }
    }$ret="";
    for($i=0;$i<strlen($utf8);$i+=3)
    $ret.=chr(substr($utf8,$i,3));return $ret;
    }function u2utf8($c)
    {
    for($i=0;$i<count($c);$i++)
    $str="";
    if ($c < 0x80) {
    $str.=$c;
    }
    else if ($c < 0x800) {
    $str.=(0xC0 | $c>>6);
    $str.=(0x80 | $c & 0x3F);
    }
    else if ($c < 0x10000) {
    $str.=(0xE0 | $c>>12);
    $str.=(0x80 | $c>>6 & 0x3F);
    $str.=(0x80 | $c & 0x3F);
    }
    else if ($c < 0x200000) {
    $str.=(0xF0 | $c>>18);
    $str.=(0x80 | $c>>12 & 0x3F);
    $str.=(0x80 | $c>>6 & 0x3F);
    $str.=(0x80 | $c & 0x3F);
    }
    return $str;
    }
    ?>调用举例:通过GD输出 "中国" 两个汉字
    example.php<?
    //Header("Content-type: image/gif");
    $im = imagecreate(400,300);
    $bkg = ImageColorAllocate($im, 0,0,0);
    $clr = ImageColorAllocate($im, 255,255,255);
    $fnt = "d:/winnt/fonts/simhei.ttf";
    include("gb2utf8.php");
    $str = gb2utf8("中国");
    ImageTTFText($im, 20, 0, 10, 20, $clr, $fnt, $str);
    ImageGif($im);
    ImageDestroy($im);
    ?>