??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美久久天天综合香蕉伊,亚洲AV无码一区东京热久久,久久国产综合精品五月天http://www.shnenglu.com/nchsea/category/2980.htmlzh-cnTue, 20 May 2008 06:54:34 GMTTue, 20 May 2008 06:54:34 GMT60Java中文处理学习W记——Hello Unicode(转帖)http://www.shnenglu.com/nchsea/archive/2006/11/07/14827.htmlseaseaTue, 07 Nov 2006 14:46:00 GMThttp://www.shnenglu.com/nchsea/archive/2006/11/07/14827.htmlhttp://www.shnenglu.com/nchsea/comments/14827.htmlhttp://www.shnenglu.com/nchsea/archive/2006/11/07/14827.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/14827.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/14827.html阅读全文

sea 2006-11-07 22:46 发表评论
]]>
汉字问题深入?-转帖http://www.shnenglu.com/nchsea/archive/2006/11/07/14826.htmlseaseaTue, 07 Nov 2006 14:43:00 GMThttp://www.shnenglu.com/nchsea/archive/2006/11/07/14826.htmlhttp://www.shnenglu.com/nchsea/comments/14826.htmlhttp://www.shnenglu.com/nchsea/archive/2006/11/07/14826.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/14826.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/14826.html汉字问题深入?作者:
一、主题:关于JAVA的中文问?
JAVA的中文问题比较突出,主要表现在控刉板输出,JSP面输出和数据库讉K上。本文尽量避开字体问题Q而只谈编码。通过本文Q你可以了解JAVA中文问题的由来,问题的解x法,其中提了一下用JDBC讉K数据库的Ҏ(gu)?

二、问题描qͼ
1Q在中文W2000中文H口~译和运行,用的是国际版的JDKQ连接的是中文W2000下的Cp936~码的SQL SERVER数据库:

J:\exercise\demo\encode\HelloWorld>make
Created by XCompiler. PhiloSoft All Rights Reserved.
Wed May 30 02:54:45 CST 2001

J:\exercise\demo\encode\HelloWorld>run
Created by XRunner. PhiloSoft All Rights Reserved.
Wed May 30 02:51:33 CST 2001
中文
[B@7bc8b569
[B@7b08b569
[B@7860b569
中文
中文
????
中文
中文
????
??
??
??

2Q如果在中文W2000的西文窗口(~码?37Q下~译Q用JAVAq行则由于无字体而无法正常显C,如果象上面一样在中文W2000的中文窗口运行,输出为:

J:\exercise\demo\encode\HelloWorld>run
Created by XRunner. PhiloSoft All Rights Reserved.
Wed May 30 02:51:33 CST 2001
????
[B@7bc0b66a
[B@7b04b66a
[B@7818b66a
????
????
????
????
????
????
中文
中文
????

三)分析

1Q出现有qQ也是Q)。由于只出现Q而没出现方框,说明只是~码有问题,而不是字体问题? 在编码中Q如果从一U字W集转换到别一U字W集Q比较典型的是从GB2312转换到ISO8859_1Q即ASCIIQ,那么很多汉字Q半个汉字)是无法映到西文字符中去的,在这U情形下Q系l就把这些字W用Q代ѝ同P也存在小字符集无法到大字W集的情况,具体原因q里׃详谈了?

2Q出C中文环境~译Q中文环境运行时汉字昄有正也有不正确的地方,同样Q在西文环境下编译,在中文环境下q行时也出现cM情况。这是由于自动(默认Q或手工Q也new String(bytes[,encode])和bytes getBytes([encode])Q{码的l果?

2.1Q在JAVA源文?->JAVAC-->Class-->Java-->getBytes()-->new String()-->昄的过E中Q每一步都有编码的转换q程Q这个过EL存在的,只是有的时候用默认的参数进行。下面我们一步一步分析ؓ什么出C面的情Ş?

2.2Q这里是源代码:

HelloWorld.java:
------------------------
public class HelloWorld
{
public static void main(String[] argv){
try{
System.out.println("中文");//1
System.out.println("中文".getBytes());//2
System.out.println("中文".getBytes("GB2312"));//3
System.out.println("中文".getBytes("ISO8859_1"));//4

System.out.println(new String("中文".getBytes()));//5
System.out.println(new String("中文".getBytes(),"GB2312"));//6
System.out.println(new String("中文".getBytes(),"ISO8859_1"));//7

System.out.println(new String("中文".getBytes("GB2312")));//8
System.out.println(new String("中文".getBytes("GB2312"),"GB2312"));//9
System.out.println(new

String("中文".getBytes("GB2312"),"ISO8859_1"));//10

System.out.println(new String("中文".getBytes("ISO8859_1")));//11
System.out.println(new

String("中文".getBytes("ISO8859_1"),"GB2312"));//12
System.out.println(new

String("中文".getBytes("ISO8859_1"),"ISO8859_1"));//13
}
catch(Exception e){
e.printStackTrace();
}
}
}

Z方便赯Q在每个转换的后面加了操作序P分别?,2,...,13?

2.3Q需要说明的是,JAVAC是以pȝ默认~码d源文Ӟ然后按UNICODEq行~码的。在JAVAq行的时候,JAVA也是采用UNICODE~码的,q且默认输入和输出的都是操作pȝ的默认编码,也就是说在new String(bytes[,encode])中,pȝ认ؓ输入的是~码为encode的字节流Q换句话_如果按encode来翻译bytes才能得到正确的结果,q个l果最后要在JAVA中保存,它还是要从这个encode转换成UnicodeQ也是说有bytes-->encode字符-->Unicode字符的{换;而在String.getBytes([encode])中,pȝ要做一个Unicode字符-->encode字符-->bytes的{换?

在这个例子中Q除那个英文H口~码的时候除外,其实情Ş下默认编码都是GBKQ在本例中,我们暂且把GBK和GB2312{同看待Q?

2.4Q由于在未指明在上面的两个用代码实现的{换中Q如果未指定encodeQ系l将采用默认的编码(q里为GBKQ,我们认ؓ上面?,6,7?,9,10是一LQ???1?2也是一LQ所以我们在讨论中将只讨?,9,10,12,13。其中的2,3,4只是用于试Q不在我们的讨论范围之内?

2.5Q下面我们来跟踪E序中的“中”字的{换历E,我们先说在中文窗口下作的~译和运行过E,注意在下面的字母下标中,我有意识C用了一些数字,以表C相同,相异q是相关2.5.1)我们先以上面?3个代码段中的的代?ZQ?

步骤 内容 地点 说明
01Q?C1 HelloWorld.java C1泛指一个GBK字符
02Q?U1 JAVACd U1泛指一个Unicode字符
03Q?C1 getBytes()W一?JAVA先和操作pȝ交流
04Q?B1,B2 getBytes()W二?然后q回字节数组
05Q?C1 new String()W一?JAVA先和操作pȝ交流
06Q?U1 new String()W二?然后q回字符
07Q?C1 println(String) 能显C“中”字Q内容和原来的相?

2.5.2Q然后再以代码段10ZQ我们注意到只是Q?

步骤 内容 地点 说明
01Q?C1 HelloWorld.java C1泛指一个GBK字符
02Q?U1 JAVACd U1泛指一个Unicode字符
03Q?C1 getBytes()W一?JAVA先和操作pȝ交流
04Q?B1,B2 getBytes()W二?然后q回字节数组
05Q?C3,C4 new String()W一?JAVA先和操作pȝ交流Q这时解析错?
06Q?U5,U6 new String()W二?然后q回字符
07Q? C3,C4 println(String) ׃中字l分成了两半Q在ISO8859_1中刚好也没有字符

能映上Q所以显CZؓ??”。在上面的示例中Q?
“中文”两个字显CZؓ“?Q?Q?
2.5.3Q在完全中文模式下的其它情ŞcMQ我׃多说?

2.6Q我们接着看ؓ什么在西文DOSH口下编译出来的cd中文H口下也出现cM情ŞQ特别是Z么居然有的情形下q能正确昄汉字?

2.6.1Q我们还是先以代码段9ZQ?

步骤 内容 地点 说明
01Q?C1C2 HelloWorld.java C1C2分别泛指一个ISO8859_1字符Q“中”字被拆开
02Q?U3U4 JAVACd U1U2泛指一个Unicode字符
03Q? C5C6 getBytes()W一?JAVA先和操作pȝ交流Q这时解析错?
04Q?B5B6B7B8 getBytes()W二?然后q回字节数组
05Q?C5C6 new String()W一?JAVA先和操作pȝ交流
06Q?U3U4 new String()W二?然后q回字符
07Q?C5C6 println(String) 虽然同是两个字符Q但已不是最初的“两个ISO8859_1?

W”,而是“两个BGK字符”,“中”显C成了“?Q?
而“中文”就昄成了“?Q?Q?

2.6.2Q下面我们以代码D?2ZQ因为它能正显C汉?

步骤 内容 地点 说明

01Q?C1C2 HelloWorld.java C1C2分别泛指一个ISO8859_1字符Q“中”字被拆开
02Q?U3U4 JAVACd U1U2泛指一个Unicode字符
03Q?C1C2 getBytes()W一?JAVA先和操作pȝ交流Q注意还是正的哦!Q?
04Q?B5B6 getBytes()W二?然后q回字节数组Q这是很关键的一步!Q?
05Q?C12 new String()W一? JAVA先和操作pȝ交流Q这是更关键的一步,JAVA已经知道B5B6要解析成一个汉字!Q?
06Q?U7 new String()W二? 然后q回字符Q真是一个项两!U7包含了U3U4的信息)
07Q?C12 println(String) q就原来的“中”字Q很委屈被JAVAC冤枉了一回,不过被程序员拨ؕ反正了一下!当然Q“中文”两个字都能正确昄了!

3Q那Z么有的时候用JDBC?
new String(Recordset.getBytes(int)[,encode])
Recordset.getSting(int)
Recordset.setBytes(String.getBytes([encode]))
?
Recordset.setString(String)
的时候会出现q了呢Q?

其实问题出现在~写JDBC的的也考虑了编码问题,它从数据库读取数据后Q可能自作主张做了一个从GB2312Q默认编码)到Unicode的{换,我的q个WebLogic For SQL Server的JDBC Driver是q样的,当我d串的时候,发出d的不是正的汉字Q可恨的是我却可以直接写汉字字串Q这让h多少有点难以接受Q?
也就是说Q我们不得不在读或写的时候进行{码,管q个转码有的时候不是那么明显,q是因ؓ我们使用了默认的~码q行转码。JDBC Driver所做的操作Q我们只有进入到源代码内部才能清楚,不是吗?


sea 2006-11-07 22:43 发表评论
]]>
谈谈Unicode~码Q简要解释UCS、UTF、BMP、BOM{名?--?谢谢作?http://www.shnenglu.com/nchsea/archive/2006/11/07/14821.htmlseaseaTue, 07 Nov 2006 14:25:00 GMThttp://www.shnenglu.com/nchsea/archive/2006/11/07/14821.htmlhttp://www.shnenglu.com/nchsea/comments/14821.htmlhttp://www.shnenglu.com/nchsea/archive/2006/11/07/14821.html#Feedback0http://www.shnenglu.com/nchsea/comments/commentRss/14821.htmlhttp://www.shnenglu.com/nchsea/services/trackbacks/14821.html谈谈Unicode~码Q简要解释UCS、UTF、BMP、BOM{名?/H2>

q是一程序员写给E序员的味ȝ。所谓趣x指可以比较轻村֜了解一些原来不清楚的概念,增进知识Q类g打RPG游戏的升U。整理这文章的动机是两个问题:

问题一Q?

使用WindowsC本的“另存ؓ”,可以在GBK、Unicode、Unicode big endian和UTF-8q几U编码方式间怺转换。同htxt文gQWindows是怎样识别~码方式的呢Q?/P>

我很早前发现Unicode、Unicode big endian和UTF-8~码的txt文g的开头会多出几个字节Q分别是FF、FEQUnicodeQ?FE、FFQUnicode big endianQ?EF、BB、BFQUTF-8Q。但q些标记是基于什么标准呢Q?/P>

问题二:
最q在|上看到一个ConvertUTF.cQ实CUTF-32、UTF-16和UTF-8q三U编码方式的怺转换。对于Unicode(UCS2)、GBK、UTF-8q些~码方式Q我原来׃解。但q个E序让我有些p涂Q想不v来UTF-16和UCS2有什么关pR?

查了查相兌料,ȝ这些问题弄清楚了,带也了解了一些Unicode的细节。写成一文章,送给有过cM疑问的朋友。本文在写作时尽量做到通俗易懂Q但要求读者知道什么是字节Q什么是十六q制?/P>

0、big endian和little endian

big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode~码?C49。那么写到文仉ӞI竟是将6C写在前面Q还是将49写在前面Q如果将6C写在前面Q就是big endian。如果将49写在前面Q就是little endian?/P>

“endian”这个词《格列佛(jng)游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开q是从小?Little-Endian)敲开Q由此曾发生q六ơ叛乱,一个皇帝送了命,另一个丢了王位?/P>

我们一般将endian译成“字节序”,big endian和little endianUC“大䏀和“小䏀?/P>

1、字W编码、内码,带介绍汉字~码

字符必须~码后才能被计算机处理。计机使用的缺省编码方式就是计机的内码。早期的计算Z?位的ASCII~码Qؓ了处理汉字,E序员设计了用于体中文的GB2312和用于繁体中文的big5?/P>

GB2312(1980q?一共收录了7445个字W,包括6763个汉字和682个其它符受汉字区的内码范围高字节从B0-F7Q低字节从A1-FEQ占用的码位?2*94=6768。其中有5个空位是D7FA-D7FE?/P>

GB2312支持的汉字太?995q的汉字扩展规范GBK1.0收录?1886个符P它分为汉字区和图形符号区。汉字区包括21003个字W?/P>

从ASCII、GB2312到GBKQ这些编码方法是向下兼容的,卛_一个字W在q些Ҏ(gu)中L有相同的~码Q后面的标准支持更多的字W。在q些~码中,英文和中文可以统一地处理。区分中文编码的Ҏ(gu)是高字节的最高位不ؓ0。按照程序员的称|GB2312、GBK都属于双字节字符? (DBCS)?/P>

2000q的GB18030是取代GBK1.0的正式国家标准。该标准收录?7484个汉字,同时q收录了藏文、蒙文、维向ְ文等主要的少数民族文字。从汉字字汇上说QGB18030在GB13000.1?0902个汉字的基础上增加了CJK扩展A?582个汉字(Unicode?x3400-0x4db5Q,一共收录了27484个汉字?/P>

CJK是中日韩的意思。UnicodeZ节省码位Q将中日韩三国语a中的文字l一~码。GB13000.1是ISO/IEC 10646-1的中文版Q相当于Unicode 1.1?/P>

GB18030的编码采用单字节、双字节?字节Ҏ(gu)。其中单字节、双字节和GBK是完全兼容的?字节~码的码位就是收录了CJK扩展A?582个汉字? 例如QUCS?x3400在GB18030中的~码应该?139EF30QUCS?x3401在GB18030中的~码应该?139EF31?/P>

微Y提供了GB18030的升U包Q但q个升包只是提供了一套支持CJK扩展A?582个汉字的新字体:新宋?18030Qƈ不改变内码。Windows 的内码仍然是GBK?/P>

q里q有一些细节:

  • GB2312的原文还是区位码Q从Z码到内码Q需要在高字节和低字节上分别加上A0?/P>

  • 对于M字符~码Q编码单元的序是由~码Ҏ(gu)指定的,与endian无关。例如GBK的编码单元是字节Q用两个字节表示一个汉字? q两个字节的序是固定的Q不受CPU字节序的影响。UTF-16的编码单元是wordQ双字节Q,word之间的顺序是~码Ҏ(gu)指定的,word内部的字节排列才会受到endian的媄响。后面还会介lUTF-16?/P>

  • GB2312的两个字节的最高位都是1。但W合q个条g的码位只?28*128=16384个。所以GBK和GB18030的低字节最高位都可能不?。不q这不媄响DBCS字符的解析Q在dDBCS字符时Q只要遇到高位ؓ1的字节,可以将下两个字节作Z个双字节~码Q而不用管低字节的高位是什么?/P>

2、Unicode、UCS和UTF

前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容Q更准确地说Q是与ISO-8859-1兼容Q,与GB码不兼容。例如“汉”字的Unicode~码?C49Q而GB码是BABA?/P>

Unicode也是一U字W编码方法,不过它是由国际组l设计,可以容纳全世界所有语a文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set"Q简UCؓUCS。UCS可以看作?Unicode Character Set"的羃写?/P>

Ҏ(gu)l基癄全书(http://zh.wikipedia.org/wiki/)的记载:历史上存在两个试囄立设计Unicode的组l,卛_际标准化l织QISOQ和一个Y件制造商的协会(unicode.orgQ。ISO开发了ISO 10646目QUnicode协会开发了Unicode目?/P>

?991q前后,双方都认识到世界不需要两个不兼容的字W集。于是它们开始合q双方的工作成果Qƈ为创立一个单一~码表而协同工作。从Unicode2.0开始,Unicode目采用了与ISO 10646-1相同的字库和字码?/P>

目前两个目仍都存在Qƈ独立地公布各自的标准。Unicode协会现在的最新版本是2005q的Unicode 4.1.0。ISO的最新标准是ISO 10646-3:2003?/P>

UCS只是规定如何~码Qƈ没有规定如何传输、保存这个编码。例如“汉”字的UCS~码?C49Q我可以?个ascii数字来传输、保存这个编码;也可以用utf-8~码:3个连l的字节E6 B1 89来表C它。关键在于通信双方都要认可。UTF-8、UTF-7、UTF-16都是被广泛接受的Ҏ(gu)。UTF-8的一个特别的好处是它与ISO-8859-1完全兼容。UTF是“UCS Transformation Format”的~写?/P>

IETF的RFC2781和RFC3629以RFC的一贯风|清晰、明快又不失严}地描qCUTF-16和UTF-8的编码方法。我LC得IETF是Internet Engineering Task Force的羃写。但IETF负责l护的RFC是Internet上一切规范的基础?/P>

2.1、内码和code page

目前Windows的内核已l支持Unicode字符集,q样在内怸可以支持全世界所有的语言文字。但是由于现有的大量E序和文档都采用了某U特定语a的编码,例如GBKQWindows不可能不支持现有的编码,而全部改用Unicode?/P>

Windows使用代码?code page)来适应各个国家和地区。code page可以被理解ؓ前面提到的内码。GBK对应的code page是CP936?/P>

微Y也ؓGB18030定义了code pageQCP54936。但是由于GB18030有一部分4字节~码Q而Windows的代码页只支持单字节和双字节~码Q所以这个code page是无法真正用的?/P>

3、UCS-2、UCS-4、BMP

UCS有两U格式:UCS-2和UCS-4。顾名思义QUCS-2是用两个字节编码,UCS-4是?个字节(实际上只用了31位,最高位必须?Q编码。下面让我们做一些简单的数学游戏Q?/P>

UCS-2?^16=65536个码位,UCS-4?^31=2147483648个码位?/P>

UCS-4Ҏ(gu)最高位?的最高字节分?^7=128个group。每个group再根据次高字节分?56个plane。每个planeҎ(gu)W?个字节分?56? (rows)Q每行包?56个cells。当然同一行的cells只是最后一个字节不同,其余都相同?/P>

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节ؓ0的码位被UCBMP?/P>

UCS-4的BMPL前面的两个零字节得CUCS-2。在UCS-2的两个字节前加上两个零字节,得CUCS-4的BMP。而目前的UCS-4规范中还没有M字符被分配在BMP之外?/P>

4、UTF~码

UTF-8是?位ؓ单元对UCSq行~码。从UCS-2到UTF-8的编码方式如下:

UCS-2~码(16q制) UTF-8 字节?二进?
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode~码?C49?C49?800-FFFF之间Q所以肯定要?字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是Q?110 110001 001001Q? 用这个比Ҏ(gu)依次代替模板中的xQ得刎ͼ11100110 10110001 10001001Q即E6 B1 89?/P>

读者可以用C本测试一下我们的~码是否正确。需要注意,UltraEdit在打开utf-8~码的文本文件时会自动{换ؓUTF-16Q可能生؜淆。你可以在设|中xq个选项。更好的工具是Hex Workshop?/P>

UTF-16?6位ؓ单元对UCSq行~码。对于小?x10000的UCS码,UTF-16~码q于UCS码对应的16位无W号整数。对于不于0x10000的UCS码,定义了一个算法。不q由于实际用的UCS2Q或者UCS4的BMP必然于0x10000Q所以就目前而言Q可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题?/P>

5、UTF的字节序和BOM

UTF-8以字节ؓ~码单元Q没有字节序的问题。UTF-16以两个字节ؓ~码单元Q在解释一个UTF-16文本前,首先要弄清楚每个~码单元的字节序。例如“奎”的Unicode~码?94EQ“乙”的Unicode~码?E59。如果我们收到UTF-16字节?94E”,那么q是“奎”还是“乙”?

Unicode规范中推荐的标记字节序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

在UCS~码中有一个叫?ZERO WIDTH NO-BREAK SPACE"的字W,它的~码是FEFF。而FFFE在UCS中是不存在的字符Q所以不应该出现在实际传输中。UCS规范我们在传输字节流前,先传输字W?ZERO WIDTH NO-BREAK SPACE"?/P>

q样如果接收者收到FEFFQ就表明q个字节是Big-Endian的;如果收到FFFEQ就表明q个字节是Little-Endian的。因此字W?ZERO WIDTH NO-BREAK SPACE"又被UCBOM?/P>

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字W?ZERO WIDTH NO-BREAK SPACE"的UTF-8~码是EF BB BFQ读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收CEF BB BF开头的字节,q道这是UTF-8~码了?/P>

Windows是使用BOM来标记文本文件的~码方式的?/P>

6、进一步的参考资?/H3>

本文主要参考的资料?"Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)?/P>

我还找了两篇看上M错的资料Q不q因为我开始的疑问都找C{案Q所以就没有看:

  1. "Understanding Unicode A general introduction to the Unicode Standard" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a)
  2. "Character set encoding basics Understanding character set encodings and legacy encodings" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03)

我写qUTF-8、UCS-2、GBK怺转换的Y件包Q包括用Windows API和不使用Windows API的版本。以后有旉的话Q我会整理一下放到我的个Z上(http://fmddlmyy.home4u.china.com)?/P>

我是x楚所有问题后才开始写q篇文章的,原以Z会儿p写好。没惛_考虑措辞和查证细节花费了很长旉Q竟然从下午1:30写到9:00。希望有读者能从中受益?/P>

附录1 再说说区位码、GB2312、内码和代码?/H3>

有的朋友Ҏ(gu)章中q句话还有疑问:
“GB2312的原文还是区位码Q从Z码到内码Q需要在高字节和低字节上分别加上A0。?/P>

我再详细解释一下:

“GB2312的原文”是指国?980q的一个标准《中华h民共和国国家标准 信息交换用汉字编码字W集 基本?GB 2312-80》。这个标准用两个数来~码汉字和中文符受第一个数UCؓ“区”,W二个数UCؓ“位”。所以也UCؓZ码?-9区是中文W号Q?6-55区是一U汉字,56-87区是二汉字。现在Windows也还有区位输入法Q例如输?601得到“啊”。(q个Z输入法可以自动识?6q制的GB2312?0q制的区位码Q也是说输入B0A1同样会得到“啊”。)

内码是指操作pȝ内部的字W编码。早期操作系l的内码是与语言相关的。现在的Windows在系l内部支持UnicodeQ然后用代码适应各种语言Q“内码”的概念比较模p了。微软一般将~省代码|定的~码说成是内码?/P>

内码q个词汇Qƈ没有什么官方的定义Q代码页也只是微软这个公司的叫法。作为程序员Q我们只要知道它们是什么东西,没有必要q多地考证q些名词?/P>

所谓代码页(code page)是针对一U语a文字的字W编码。例如GBK的code page是CP936QBIG5的code page是CP950QGB2312的code page是CP20936?/P>

Windows中有~省代码늚概念Q即~省用什么编码来解释字符。例如Windows的记事本打开了一个文本文Ӟ里面的内Ҏ(gu)字节:BA、BA、D7、D6。Windows应该L么解释它呢Q?/P>

是按照Unicode~码解释、还是按照GBK解释、还是按照BIG5解释Q还是按照ISO8859-1去解释?如果按GBK去解释,׃得到“汉字”两个字。按照其它编码解释,可能找不到对应的字符Q也可能扑ֈ错误的字W。所谓“错误”是指与文本作者的本意不符Q这时就产生了ؕ码?/P>

{案是Windows按照当前的缺省代码页去解释文本文仉的字节流。缺省代码页可以通过控制面板的区域选项讄。记事本的另存ؓ中有一ANSIQ其实就是按照缺省代码页的编码方法保存?/P>

Windows的内码是UnicodeQ它在技术上可以同时支持多个代码c只要文件能说明自己使用什么编码,用户又安装了对应的代码页QWindowsp正确昄Q例如在HTML文g中就可以指定charset?/P>

有的HTML文g作者,特别是英文作者,认ؓ世界上所有h都用英文,在文件中不指定charset。如果他使用?x80-0xff之间的字W,中文Windows又按照缺省的GBK去解释,׃出现q。这时只要在q个html文g中加上指定charset的语句,例如Q?BR><meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">
如果原作者用的代码和ISO8859-1兼容Q就不会出现q了?/P>

再说Z码,啊的Z码是1601Q写?6q制?x10,0x01。这和计机q泛使用的ASCII~码冲突。ؓ了兼?0-7f的ASCII~码Q我们在Z码的高、低字节上分别加上A0。这样“啊”的~码成为B0A1。我们将加过两个A0的编码也UCؓGB2312~码Q虽然GB2312的原文根本没提到q一炏V?

 



sea 2006-11-07 22:25 发表评论
]]>
þþþƷһ| 99ŷƷþþѿ | 91þ㽶Ů߿| ˾þþþƷ| Ʒþþþ| ľƷþþþ޲| ٸþ| Ʒþ| þþƷAVӰ| þþƷֻоƷ66| ĻþþƷAPP| Ʒþþþþþ| պ޹ۺϾþþ| Ʒþ| ˾þóۺӰԺ| ƷþþþþӰԺ| ŷ޾Ʒ˾þ| ƷþþþþĻ| þþþþþƷο | ɫۺϺϾþۿ| ƷþþþþĻһ | ҹƷþþþ| þ޹ӰԺվ | 1000Ʒþþþþþþ| þþþþþþþѾƷ| 99þֻоƷ| 69ƷþþþAPP| պŷþ| þۺϺݺɫۺ| þ66͵Ʒ9| ɫۺϾþþþһ| ɫúݺݾþۺ| þþþúǿ׊| ɫۺϾþ߹ۿ| ӰɫۺϾþ| þþþþþþŮ| þĻԴվ| þۺɫݺ| þñۺϾþ| þùһ| þԭƷ|