关于字符集的问题! 恳请指点!!唐晓峰请进!诸位专家请进!(100分)

  • 主题发起人 主题发起人 Nuke2
  • 开始时间 开始时间
N

Nuke2

Unregistered / Unconfirmed
GUEST, unregistred user!
我对各种字符集一向蒙蒙东东的.
现在做毕业设计(一个中文mail收发软件),想就此问题请教专家!
所谓的 unicode gb2312 gbk......
等字符集究竟代表什么,不同的设定会对软件编程带来什么影响呢?
我目前从所看的一点资料(太难找了,谁有详细资料可一定告诉我一声!
先谢了!:)
我对字符集的理解就是类似于字体一类的东东,当然只是一个比方,
字体编码对应着字库内的相关字型描述,而字符集编码对应着相关的
字符,能不能这么理解呢?
请教有经验的专家,在设计类似email的软件时,应对对方发过来的
信件的字符集做何处理呢,如果不对其进行处理会有什么情况?(乱码?);
(比如说对方发过来一封gb2312和一封西欧字符集的信,我该怎么处理呢)
请专家说得尽可能详尽些,我做毕设已到关头,从对字符集一无所知开始
要针对字符集进行处理,实在难度大!
恳请指点!!谢谢!!
 
哦!再补充一点!
我看了SakeMail的原码,其中的Quoteprintable解码函数上加了一个
注释("This function only works with IOS_XXXXXX")
这么说邮件的编码也要针对字符集做处理吗?
那么岂不是每种字符集都要写相应的编码程序?????
(实在无知,请多指点!)
 
看样子只有我救你出苦海了!
谈到字符集就不能不提ASCII了,你应该知道它是1个Byte,其16进制最大的为FFH即
255个西文字符,这就是你常见的字符如“+”、“^”等等,还包括图形字符如Chr(220)
等。
为了让计算机能够处理中文字符,早期国家定义是1个Word(2个Byte)代表一个汉字,
这也是你所见的,为什么汉字是2个字节的原因。因为此,其包括汉字总数是FF*FFH
即65535个汉字,这也是国标妈的由来。这也就是为什么大陆的汉字只能是6千多个汉字
的真正原因。
但由于国际交流的不断深入,社会的不断发展,6千个汉字显然不能满足工作的需要,
这就出现了台湾的Big5、日本的汉字、南韩等国的汉字编码,利用Big5编码的汉字
能容纳几十万的汉字,为了能够自由转换这些编码的汉字,就出现了各种解码工具,
象你说的。
这里简单扼要地说明一下,它的内容太多了,不能一言一必之。若有机会的话,可
到图书馆查阅有关的资料,整整一厚本呢!?
 
Jams的说法好象有问题.
1.由于计算机是英语国家发明的,早期的计算机使用8位的字符集,就是一个字节表示
一个字符,总共可以表示256个.这个时候主要有两个标准:ASCII和IBM的叫做B???
(具体名字望了,用UNIX就必然涉及到的).但由于早期的通信方式都是7bit信息+
1bit奇偶校验,所以一般只定义了256个字符的低128个,而没有高128个.在硬件技
术大大提高,不需要奇偶校验后,不同设备的制造商就对其高128个符号采取了不
同的定义,如IBM PC的OEM字符集就是显示设备厂商和IBM对ASCII扩展定义的.而
M$的Windows一开始就基本放弃了ASCII的高128个符号的定义,只使用其低128符
号.
2.ASCII并不能满足全世界的要求,特别是中国、韩国等字符多的国家.于是,各国纷
纷制定自己的字符扩展标准.其中中国曾经出现过的一些标准:HZ,GB2312,GBK等,
其中HZ好象是用"~{"和"}~"括住表示汉字的内容,内部用特定的双字节编码,而没
有括住的部分按ASCII译码.GB2312是比较早的双字节汉字编码,它并没有使用双
字节的全部码点,而只使用了其中6千多个(双字节共有6万多个码点),均分布在
ASCII的高128符号区(128X128=16384>6000).这样在软件中可以智能识别汉字
和ASCII.由于6千个汉字不能满足应用的要求,国家标准局对GB2312进行扩展,在
其中又增加了约2000个字,成为GBK.在汉字编码发展过程中,还出现过3字节和4字
节的编码,但都淘汰了.
3.香港,台湾和澳门使用的GIB5是另一套汉字编码方案,与GBK处于同等地位,但相互
不兼容.
4.ISO为适应全球交流,对各个国家的语言都制定过字符集标准,有单字节的,也有多
字节的,在e-mail和HTML可以制定使用的字符集,从而使接收方的软件可以正确解
码.数据库应用中指定字符集,主要是在排序时可以针对不同国家的文字进行不同
的排序.
5.M$的野心:M$为了独霸OS市场,提出将双字节编码的码点分配给各个语言(6万多个
码点,足够全世界语言文字的分配),这就是UNICODE.UNICODE的所有字符都是两个
字节长,不同语言分布在不同码点位置.这样,同一套软件就可以用相同的方法处理
不同的软件(当然,这只是理想而已).现在已经有某些机构接纳UNICODE.比如,
JAVA就采用UNICODE.
 
漏洞多多!
1、最早期的ASCII只使用了7位,128个字符,现在用的是扩展ASCII
2、国标码汉字的内码是从A0-FF,第一字节称为区,第二字节称为位,
可用汉字只有96区*96位个,(区位码由此得名),不到1万,
 
概念差不多懂了一点
但在程序中应怎样处理呢?
比如现在有两封邮件发了过来,一封是Gb2312的,一封是ISO...的
应怎样解码呢?
 
1.IE和NS的方法:给每个标准的字符集准备一套字体,如GB2312是"宋体",
BIG5是"细明体",ASCII是"Fixdsys",等等.然后,对不同字符集的字符,
用不同的字体画就可以了.
2.转换法:将本OS平台不支持的字符集转换到本OS平台的字符集,如将BIG5
转换到GBK,等等.但如果本OS平台没有合适的字符集,就麻烦了.比如英文
Windows上,必须安装汉字平台才可能使用GBK等等.
3.Quoteprintable是一种编码方式,而表示字符集,全面忘说了.
 
哇!看样子我是来晚了,(我也在写论文,头都大了)
大家把该说的都讲了,我补充一点吧!
>注释("This function only works with IOS_XXXXXX")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这地方是SakMail最大的bug,它没有考虑到双字节,这里它只支持单字节码,
要想对双字节的邮件正确进行解码,你应在解码的时候
应按双字节考虑,
~~~~~~~~~~~~~
至于如何解码,你不应该从gb2312,is....上考虑
我给你的rfc中已经很全了,你还是好好把它肯肯吧!
 
唐晓锋:
您好 !
我一直等着您的rfc呢,可是还是没有收到,能不能请您把
那个rfc再mail一遍呢?还有那个imapi的rfc,好吗?
哦,还有,请mail到xiaxin@126.com好吗?
我在学校的信箱有好多IP无法连通的.:(
谢谢!
 
还是有很多地方没有讨论到,比如ansistring与unicode和oem之间如何转换
比如说如果你用mscomm控件收发汉字而不作转化的话,包你得到一捆割成两节
的汉字乱码
 
恳请大家说详细一点儿.
我的毕业设计只剩三个星期了,没时间再慢慢琢磨,
毕业设计对我的意义,想必大家也都知道.
多支持一点儿吧!
谢谢!
xiaowind,你的说明我想详细了解一下,能深入的谈一下么?
 
xiaowind好像说的是传口传输的问题.
在发送邮件之前汉字都是经过编码的,邮件里面只有ascii码!
你到我们学校的Ftp上下载吧.
ftp://ftp.shtdu.edu.cn/incoming/delphi
 
正在下载唐晓锋的MFC......
谢谢唐晓锋!!!!
能否请唐晓锋指导再说一下有关注意事项呢?比如一些细节方面应
注意什么,我的时间非常紧,怕忙中出错.
 
注意quoted-printable解码,icm等控件对这种编码的解码不好.
 
哈哈!
在唐教头的ftp目录里发现了coolmail控件,爽死了.
唐晓峰老师,请您一定把那个控件的原代码mail给我一份,(两百分立马奉上);
倒不是我想坐想其成,昨夜我研究您提供的Rfc一直到凌晨2点多.
也只看了个大概.到看到可以实际操作恐怕也就已经验收了.
请多多支持,多多支持!!!!!
最近平均每天泡在计算机上16个小时,明显有点身体发虚,等会必须
出去放放风了.........
------可怜的Nuke
 
呜.....呜....
溜达了一圈回来,还是没有唐晓锋老师的消息......
我等..我等呀等........
唐晓锋老师,就把那个原程序放到ftp上,我去取.OK!
以前给您发过好几次信,我这儿的邮件服务器访问不到你那儿的!
 
"可怜的Nuke":
因为我这个控件已经用于商业(我们学校的一个项目里面涉及到许多事情),
我的老师不同意我公开源代码,真的很抱歉 Sorry
 
啊!
什么....竟然..........见死不救............ :(
可是您已公开了dcu文件,又为什么不能把原代码给我看看呢?
光解一个QuotePrintable的程序不会有什么商业秘密呀
Sakemail都把原代码公开了呢.
那能不能只把那个cool的解quoteprinbable和有关字符集处理的函数给我??
真的请您帮帮忙.现在只剩两周了,如果到时拿不出一个合格的Email软件
来,我的工作可就难办了呀.
谢谢谢谢!
现在都紧张死了,平时书看得是不少,上机实际编程却不多,如今问题可大
了,除了编码上的问题,还有一大堆网络编程(毕业设计不准用现成控件的),
以及实际的数据处理,界面处理,人机交互等一大堆问题.
时间太紧了.我现在连吃饭都得跑步去食堂再一路狂奔回来.
您一定帮帮忙,就给我一份原程序吧,简化版也成,只要能让我从中快速学会
字符集和QuotePrintable的处理方法就成.就算是给我个教学版吧.
这样就不会和商业有什么冲突了.
其余的什么HZ,BINHEX我就自己慢慢解决,
拜托..拜托!
哎.....第一次......这样求人......................................


 
我以前已经给你解释过很多关于邮件的问题了,居然说我见死不救:(
太让我伤心了. :......(
我想了一个折中的办法,我把一个程序的解码拿过来,又结合我的思想
写了一个函数.这样,既和我交给老师的不一样,又能帮到你,下列函数
已经调试过了.
function LineQuotedPrintable(FCurrentData: Pchar):Pchar;
var
SourceIndex : Integer;
DecodedIndex : Integer;
Ch : Char;
Code : Integer;
begin
SourceIndex := 0;
DecodedIndex := 0;
if (FCurrentData <> nil) and (FCurrentData^ <> #0) then
begin
while TRUEdo
begin
Ch := FCurrentData[SourceIndex];
if Ch = #0 then
break;
if Ch <> '=' then
begin
FCurrentData[DecodedIndex] := Ch;
Inc(SourceIndex);
Inc(DecodedIndex);
end
else
begin
Inc(SourceIndex);
Ch := FCurrentData[SourceIndex];
if Ch <> #0 then
begin
Code := HexConv(Ch);
Inc(SourceIndex);
Ch := FCurrentData[SourceIndex];
if Ch <> #0 then
begin
Code := (Code shl 4) + HexConv(Ch);
Inc(SourceIndex);
end;
FCurrentData[DecodedIndex] := Chr(Code);
Inc(DecodedIndex);
end;
end;
end;
FCurrentData[DecodedIndex] := #0;
end;
Result:=FCurrentData;
end;

procedure QuotedPrintableDecode(var Strs:TStringList);
var I:integer;
proceduredo
WithIt(Str:TStrings);
var I,J :Integer;
Ct :Integer;
NextBuf :String;
Buf :String;
begin
for I:=0 to Str.Count -1do
begin
J:=1;
Ct:=0;
Buf:=Trim(Str);
if I+1 = Str.Count then
continue ;
NextBuf:=Trim(Str[I+1]);
if (NextBuf = '') or (Buf = '') then
continue;
While J <> Length(Str)do
begin
if Str[J] = '=' then
Inc(Ct);
Inc(J);
end;
if ((Ct mod 2)<>0) and (I+1 <> Str.Count) then
begin
if NextBuf[1] = '=' then
begin
Str:=Str+Copy(Str[I+1],2,2);
Delete(NextBuf,1,3);
Str[I+1]:=NextBuf;
end;
end;
end;
end;
begin
do
WithIt(Strs);
for I:=0 to Strs.Count-1do
Strs.Strings:=StrPas(LineQuotedPrintable(Pchar(Trim(Strs.Strings))));
end;
 
啊!!
上帝降临!!!!
谢...谢...啦........(感动!....)
您的程序等会儿慢慢研究.....
这段程序应该可以解汉字了吧,和sakemail的处理方法区别在哪里呢?
能不能说说?(正在解决网络传输的问题,大概明后天才能仔细研究您的
程序,先请您谈谈)
BASE64 HZ是不是只要依样画瓢就成了呢?
哦! 还有,您在coolmail的说明文档中说其中的quoteprintable解码极cool
那么主要特点在哪儿呢?
关于字符集处理的部分能不能给个例程什么的???(死皮赖脸状)
帮人帮到底呀!
:P
 
后退
顶部