字符集

来源:互联网 发布:助赢软件 编辑:程序博客网 时间:2024/06/03 10:26

字体

WINDOWS系统字体大都为位图字体(Bitmap fonts),如System,Fixedsys,Terminal等,这些字体具体拥有那些字符我还不清楚。在记事本里无论是希腊字母、中文字符或者是日文、韩文等,这些字体都能正常显示(原因可能是用了其他字体里的字符),但有些我自己做的_MBCS版本下的windows程序用System字体并不能正常显示除拉丁文以外的字符如程序(KeyView2的release版本),有些则能如(PickFont的release版本)。但是_UNICODE,UNICODE版本下的WINDOWS程序能正常显示其他字符。(原因可能是KeyView2是通过输入法传给程序的,而PickFont的代码有所不同,因为该程序是chap17的,有些内容还不懂,所以具体原因并不知晓)。

1.UNICODE版本的WINDOWS程序和MBCS版本的程序

字体中的每一个字符都有相应的UNICODE码即U+####,不同的字体拥有不同的字符集,一个或多个,不同字符集中同一个字符编码对应的字符可能不一样,所以设置了字体的字符集不同,同一编码显示的字符就不相同。MBCS版本下的程序一个字符可能是一个字节也可能是两个字节,一般是根据字节的大小来判断,如果一个字节小于128,则该一个字节代表一个字符(单字节字符),若大于,则该字节与后面的字节一起组成一个字符(双字节字符)。UNICODE版本下的程序一个字符就默认是两个字节的,如果某一个字体的这个字符集版本中没有改字符,那么换另一个字符集就可能正常显示。


2.字符集

一个字符集来说要正确编码转码一个字符需要三个关键元素:字库表(characterrepertoire)、编码字符集(coded character set)、字符编码(characterencoding form)。其中字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围。编码字符集,即用一个编码值 code point来表示一个字符在字库中的位置。字符编码,将编码字符集和实际存储数值之间的转换关系。

字符“A", 16进制位0x41,二进制为:01000001

编码长度:1000001        7位

表示长度:01001001      8位

2.UNICODE
2.1UCS

说到UNICODE就离不开电脑对字符的编码和解码,UNICODE的编码字符集有两种UCS-2(Universal Character Set in 2 octets)和UCS-4(Universal Character Set coded in 4 octets),表示了字库表中某个字符与点码的对应关系。后者兼容前者,UCS-2用2位字节代表一个字符,UCS-4用4个字节代表一个字符,UCS-4的最高位为0,按最高字节分成2^7个group,每个group按照次最高字节分成2^8个plane,每个plane按照第三字节分成2^8个rows,每行包括256个cells。group0的plane0 称为Basic Multilingual Plane 即BMP。

2.2UTF

UTF(Universal Character Set Transformation Format),UCS都只是规定如何编码,没有规定如何传输、保存这个编码。UTF-8、UTF-16就是对点码的保存和传输方法。UTF-8的编码规则如下:

例如:

1byte
2byte3byte4byte0#######   110#####10######  1110####10######10###### 

实际字符

在Unicode字库序号的十六进制

在Unicode字库序号的二进制

UTF-8编码后的二进制

UTF-8编码后的十六进制

$

0024

010 0100

0010 0100

24

¢

00A2

000 1010 0010

1100 0010 1010 0010

C2 A2

20AC

0010 0000 1010 1100

1110 0010 1000 0010 1010 1100

E2 82 AC

具体细节细细体会。

而UTF-16编码方案是UCS-2字符集字符点码原样保存。

2.3BOM

文件在传输过程中使用的编码方案是什么,我们用这种方法做标记,在文件开头使用BOM(Byte Order Mark)。这个表如下:

编码
表示 (十六进制)
表示 (十进制)
UTF-8
EF BB BF
239 187 191
UTF-16(大端序)(BE)
FE FF
254 255
UTF-16(小端序)(LE)
FF FE
255 254
UTF-32(大端序)
00 00 FE FF
0 0 254 255
UTF-32(小端序)
FF FE 00 00
255 254 0 0
“汉”字的Unicode码是6C49,如果6C写在前面则为大端序,49写在前面则为小端序。

字符集相关



3.内码
内码是指操作系统内部的字符编码。早期操作系统的内码是与语言相关的。现在的Windows在系统内部支持Unicode,然后用代码页适应各种语 言,“内码”的概念就比较模糊了。微软一般将缺省代码页指定的编码说成是内码。

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

Windows中有缺省代码页的概念,即缺省用什么编码来解释字符。例如Windows的记事本打开了一个文本文件,里面的内容是字节流:BA、 BA、D7、D6。Windows应该去怎么解释它呢?

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

答案是Windows按照当前的缺省代码页去解释文本文件里的字节流。缺省代码页可以通过控制面板的区域选项设置。记事本的另存为中有一项 ANSI,其实就是按照缺省代码页的编码方法保存。

Windows的内码是Unicode,它在技术上可以同时支持多个代码页。只要文件能说明自己使用什么编码,用户又安装了对应的代码 页,Windows就能正确显示

LOCAL与字符集
字体、字符集

各种编码UNICODE、UTF-8、ANSI、ASCII、GB2312、GBK详解

GBK编码表与编码字库

字符编码详解__彻底理解掌握编码知识,“乱码”不复存在

编码原理之------从原理上搞定编码(***初识编码***),重点为什么又编码?什么是编码?什么是解码?什么是字节流?


各种字符集和编码详解


原创粉丝点击