说说GB2312、GB18030编码,以及OTRS Postmast中的UTF8编码转换

一般问题,技术文档,通告 & 与 OTRS 相关的事件

Moderator: never

micshi
OTRS wizard
Posts: 191
Joined: 05 Jul 2011, 16:10
OTRS Version?: 3.2.2
Real Name: Micshi
Location: Beijing
Contact:

说说GB2312、GB18030编码,以及OTRS Postmast中的UTF8编码转换

Postby micshi » 08 Jun 2012, 20:05

B18030是国家强制执行的标准,从2001年9月开始执行,另外GB18030与早期的汉字编码GB2312完全兼容。

在简体中文Windows 7系统中,所有与汉字处理相关的应用软件(如微软的OFFICE、IE Explorer、Wordpad、Notepad等)均采用GB18030编码作为汉字的内码。
这意味着,即使你明确选择GB2312编码,Windows照样采用GB18030编码作为汉字的内码,因为GB18030与GB2312完全兼容。下面,让我们做个试验证明一下。

用于试验的简繁混合的文本

Code: Select all

請以手動調正Exposure Time到1/120或其他參數,確認是否還有閃爍
现因在网上挂了【受注審査委員会規程】,
下記目的により、鶴錦へメーリングリストの使用権限を与えていただきたく、
お願いいたします。
電愛偉龍


将上述简繁混合汉字保存至文件source.txt
1. 打开notepad
2. 将上面的简繁混合的汉字文本拷贝并粘贴的notepad中
3. 选择“另存为”,将文件保存至source.txt
4. 退出notepad

将source.txt按gb18030和gb2312编码分别保存至文件gb18030.txt和gb2312.txt
1. 用微软IE浏览器打开source.txt(首先确认IE中是否能正确显示这些简繁混合汉字。若不能,则点击“查看”-“编码”,然后选择gb2312或gb18030直至IE能正确显示这些简繁混合的汉字)
2. 选择“另存为”(CTRL+S),
3. 选择GB18030编码,将文件保存至gb18030.txt
4. 再一次选择“另存为”(CTRL+S)
5. 选择GB2312编码,将文件保存至gb2312.txt
6. 再一次选择“另存为”(CTRL+S)
7. 选择Unicode(UTF-8)编码,将文件保存至utf8.txt
6. 关闭微软IE浏览器

此时,若用notepad分别找开source.txt、gb18030.txt、gb2312.txt或utf8.txt,你会发现notepad都能正确显示这些简繁混合的汉字。
哪这几个文件的汉字编码都一样吗?让我们执行一下DOS的文件比较命令(十进制比较),看看究竟有什么不同。

首先,用utf8.txt与gb18030.txt进行比较
comp utf8.txt gb18030.txt /D
上述命令执行的结果是:“文件大小不同”。
这个好理解,utf8与gb18030编码不同,文件比较结果当然不同了。

然后,再用source.txt 和gb2312.txt与gb18030.txt进行比较
comp source.txt gb18030.txt /D
comp gb2312.txt gb18030.txt /D
上述两行命令执行的结果都是:“文件比较无误”。
source.txt和gb2312.txt与gb18030.txt完全相同,而gb18030.txt是按gb18030编码保存的。这说明source.txt和gb2312.txt同样采用的是gb18030汉字编码。
即在默认情况下或明确指明gb2312编码的情况下,简体中文版Windows 7上的应用程序都是采用gb18030编码作为汉字的内码。
同理,在outlook中即使你明确指明采用gb2312编码,outlook还是采用gb18030作为汉字的内码,所以outlook才能正确地显示简繁混合的汉字文本。
相反的例子是在简体中文版Windows XP或2000(没有安装过gb18030语言支持包),由于gb2312编码的限制,Windows系统只能处理那6763个简体汉字。

下面再谈谈OTRS Postmaster
Postmast工作步骤如下:
1. 收接邮件
2. 将文字的编码转换至utf8
3. 如果邮件中不包含ticket number,则创建新工单
4. 如果邮件中包含ticket number, 则为此工单创建新的信件

我们现在关心的是第2步,如何将文字的编码转换至utf8。
编码转换只需要三个参数: 原始编码,要转换文本和目标编码。现在转换文本和目标编码(utf8)都明确了,唯一的问题是如何确定原始编码。
OTRS Postmaster是按邮件中的charset标识确定原始编码,如果charset=gb18030,Postmaster就将邮件文本从gb18030转换至utf8;如果charset=gb2312,Postmaster就将邮件文本从gb2312转换至utf8。
charset值的设定取决于邮件客户端软件配置。例如,在outlook中可以将发送邮件的编码指定为gb2312或gb18030,那么charset值就等于gb2312或gb18030。
在outlook中,不论你指定的编码是gb2312还是gb18030,邮件正文还是采用gb18030编码。

现在假设要转换的邮件正文采用gb18030编码且包含简繁汉混合的文本,根据charset的设置值,执行OTRS Postmaster后会出现以下状况:
当charset=gb18030时,OTRS能正确显示所有汉字,不会出现乱码。
当charset=gb2312时,OTRS只能显示gb2312中所包含的那6763简体汉字,其余的均显示为乱码(这是因为无法将gb2312编码中不存在的汉字转换为utf8)。

下面让我们再做个试验证明一下。
试验环境要求:
1. OTRS安装在Linux系统之上
2. 已安装Encode::HanExtra
3. 在Encode::HanExtra的Config.pm中,删除'gb18030' => 'Encode::HanExtra'前面的注解符'#'

创建一个简繁汉字混合的邮件,以便OTRS Postmaster接收邮件、转换utf8编码并创建新的工单。

Code: Select all

From customer@xyz.com  Fri Dec 21 23:59:24 2001
Return-Path: <customer@xyz.com>
Received: (from customer@xyz.com)
   by avro.de (8.11.3/8.11.3/SuSE Linux 8.11.1-0.5) id f3MMSE303694
   for martin@localhost; Fri, 21 Dec 2001 23:59:24 +0200
Date: Fri, 21 Dec 2001 23:59:24 +0200
From: customer <customer@xyz.com>
To: helpdesk@xyz.com
Subject: 電愛偉龍
Message-ID: <20011221002814.A3599@avro>
Mime-Version: 1.0
Content-Type: text/plain; charset=gb18030
Content-Disposition: inline
X-Operating-System: Linux 2.4.10-4GB i686
X-Uptime: 12:23am  up  5:19,  6 users,  load average: 0.11, 0.13, 0.18
X-CVS: $Id: PostMaster-Test1.box,v 1.2 2007/04/12 23:55:55 martin Exp $
Content-Length: 139
請以手動調正Exposure Time到1/120或其他參數,確認是否還有閃爍

现因在网上挂了【受注審査委員会規程】,
下記目的により、鶴錦へメーリングリストの使用権限を与えていただきたく、
お願いいたします。

電愛偉龍


1. 打开notepad
2. 将上述文本拷贝并粘贴的notepad中
3. 执行替换,将字符串customer@xyz.com全部替换为OTRS安装实例中真实用户的邮件地址
4. 执行替换,将字符串helpdesk@xyz.com全部替换为OTRS安装实例中真实队列的邮件接收地址
5. 选择“另存为”,将文件保存至gb18030.eml
6. 再执行替换,将字符串charset=gb18030替换为charset=gb2312
7. 选择“另存为”,将文件保存至gb2312.eml
8. 退出notepad
注意:此时gb18030.eml和gb2312.eml均采用gb18030编码,唯一的不同是一个是charset=gb18030,另一个是charset=gb2312。
9. 将文件gb18030.eml和gb2312.eml上传至OTRS所在的Linux系统上的某个目录中,例如:/tmp
10. 在Linux系统中,执行下面的命令:
cat /tmp/gb18030.eml | /opt/otrs/bin/otrs.PostMaster.pl
/opt/otrs/bin/otrs.DeleteCache.pl
按F5键,刷新OTRS仪表板网页,将看到一个新工单。打开工单后,你会发现OTRS能正确显示简体汉字、繁体汉字和日文。
11. 在Linux系统中,执行下面的命令:
cat /tmp/gb2312.eml | /opt/otrs/bin/otrs.PostMaster.pl
/opt/otrs/bin/otrs.DeleteCache.pl
按F5键,刷新OTRS仪表板网页,将看到一个新工单。打开工单后,你会发现OTRS只能显示简体汉字,繁体汉字和日文均显示为乱码。

至此,我们可以得出的结论是:
在邮件客户端应用程序中(例如outlook),即使邮件正文采用gb18030作为编码,你还必须明确指明charset=gb18030,否则OTRS Postmaster无法将邮件中的繁体汉字编码转换至utf8。同样的情况下,
如果明确指明charset=gb2312,OTRS Postmaster只能将gb2312中包含的那6763个简体汉字转换为utf8,其它“汉字”因无法转换,而显示为乱码。

最后的问题是,不论什么原因,你非要将成千上万的outlook邮件客户端的邮件发送编码设置为gb18030。根据不同的情况,你可以选择以下解决方案:
1. 企业部署了活动目录且所有邮件客户端均使用outlook
在活动目录的组策略中调用outlook配置模板,可以将outlook邮件发送编码统一设置为gb18030。
2. 如果你的企业没有实现微软的活动目录或部署了活动目录但未强制要求使用统一某种邮件客户端软件(允许任意使用杂七杂八的邮件客户端软件)
逐台计算机进行设置,如果嫌麻烦或嫌太累了就放弃使用OTRS。

micshi
OTRS 3.2.2, ITSM 3.2.2, SystemMonitor
Ubuntu, Apache2, MySQL 5
My OTRS Blog
OTRS Basic Concept Training
OTRS Demo Instance

nuera
OTRS newbie
Posts: 16
Joined: 27 May 2012, 12:21
OTRS Version?: 3.1.5

Re: 说说GB2312、GB18030编码,以及OTRS Postmast中的UTF8编码转换

Postby nuera » 09 Jun 2012, 06:59

非常感谢 micshi!!!
您的思路清晰,描述简练明确,现在在网上很少能见到这样的帖子了。
再次感谢您的耐心和辛苦的劳动!!!
OTRS是一款非常好的开源软件,我想以后也会越来越完善的。
再次感谢 micshi!!!

micshi
OTRS wizard
Posts: 191
Joined: 05 Jul 2011, 16:10
OTRS Version?: 3.2.2
Real Name: Micshi
Location: Beijing
Contact:

Re: 说说GB2312、GB18030编码,以及OTRS Postmast中的UTF8编码转换

Postby micshi » 09 Jun 2012, 16:02

感谢 nuera 的表杨和鼓励!

我在想,微软的Windows应用程序将gb2312编码选项视为gb18030进行处理是完全合理的。因为gb2312已被淘汰了,它被gb18030所取代,且gb18030与gb2312完全兼容。

看来OTRS也应该与时俱进,同样将gb2312编码选项视为gb18030进行UTF8编码转换,这样可减轻我们对邮件客户端的配置管理的负担。

我将试着修改OTRS代码,若努力失败,我会请求OTRS进行修改。

一旦有结果,我会通知大家。

micshi
OTRS 3.2.2, ITSM 3.2.2, SystemMonitor
Ubuntu, Apache2, MySQL 5
My OTRS Blog
OTRS Basic Concept Training
OTRS Demo Instance

micshi
OTRS wizard
Posts: 191
Joined: 05 Jul 2011, 16:10
OTRS Version?: 3.2.2
Real Name: Micshi
Location: Beijing
Contact:

Re: 说说GB2312、GB18030编码,以及OTRS Postmast中的UTF8编码转换

Postby micshi » 10 Jun 2012, 18:01

按以下提示修改OTRS源代码,可以将从gb2312到utf-8的文本编码转换强制改为从gb18030到utf-8的文本编码转换。

Code: Select all

root@helpdesk:/opt/otrs/Kernel/System# diff -u Encode.pm.backup Encode.pm
--- Encode.pm.backup    2012-06-10 23:28:55.496628598 +0800
+++ Encode.pm   2012-06-10 23:29:08.077791093 +0800
@@ -113,6 +113,7 @@
         }
     }

+    $Param{From} =~ s/gb2312/gb18030/i;
     # if no encode is needed
     if ( $Param{From} eq $Param{To} ) {

@@ -216,6 +217,7 @@
         return;
     }

+    $Param{From} =~ s/gb2312/gb18030/i;
     return $Self->Convert( %Param, To => 'utf-8' );
 }


这样,当你指定以gb2312编码向OTRS发送邮件时,OTRS能正确的显示简体、繁体,以及非汉字常见字符。

micshi
OTRS 3.2.2, ITSM 3.2.2, SystemMonitor
Ubuntu, Apache2, MySQL 5
My OTRS Blog
OTRS Basic Concept Training
OTRS Demo Instance

nuera
OTRS newbie
Posts: 16
Joined: 27 May 2012, 12:21
OTRS Version?: 3.1.5

Re: 说说GB2312、GB18030编码,以及OTRS Postmast中的UTF8编码转换

Postby nuera » 11 Jun 2012, 02:43

您的思路真是太巧妙了!!!
强烈建议OTRS下一个版本把您的方法加进去!

我的初步测试完全正常!!!
五体投地亦不能表达我的感激之情啊。。。。。。

ps:micshi,身体是革命的本钱,看您都是深夜发帖回帖,
偶尔有之无可厚非,但长时间熬夜对身体伤害很大,还请以
健康为重。

NiNoSan
OTRS newbie
Posts: 1
Joined: 28 May 2013, 06:55
OTRS Version?: 3.2.5
Real Name: Henry

Re: 说说GB2312、GB18030编码,以及OTRS Postmast中的UTF8编码转换

Postby NiNoSan » 28 May 2013, 07:13

您好,实在是很高兴能找到这篇帖子,我尝试照做了一下,不过没有成功。
请问是在两个位置添加“$Param{From} =~ s/gb2312/gb18030/i;”这段代码就可以了吗?

@@ -113,6 +113,7 @@
@@ -216,6 +217,7 @@
这两行是什么意思呢?

抱歉我不懂perl,只是管理OTRS而已,目前台湾的客户遇到这个问题,我正在尝试解决。
如能指导,将非常感谢!

micshi
OTRS wizard
Posts: 191
Joined: 05 Jul 2011, 16:10
OTRS Version?: 3.2.2
Real Name: Micshi
Location: Beijing
Contact:

Re: 说说GB2312、GB18030编码,以及OTRS Postmast中的UTF8编码转换

Postby micshi » 28 May 2013, 13:30

NiNoSan wrote:您好,实在是很高兴能找到这篇帖子,我尝试照做了一下,不过没有成功。
请问是在两个位置添加“$Param{From} =~ s/gb2312/gb18030/i;”这段代码就可以了吗?


对。

@@ -113,6 +113,7 @@
@@ -216,6 +217,7 @@
这两行是什么意思呢?

是diff命令输出的结果,告诉你原始文件与经过修改的文件之间的区别,不同之处出现在哪里。

micshi
OTRS 3.2.2, ITSM 3.2.2, SystemMonitor
Ubuntu, Apache2, MySQL 5
My OTRS Blog
OTRS Basic Concept Training
OTRS Demo Instance


Return to “综合”

Who is online

Users browsing this forum: No registered users and 1 guest