字符集
来源:互联网 发布:助赢软件 编辑:程序博客网 时间: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的编码规则如下:
例如:
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)。这个表如下:
字符集相关
内码这个词汇,并没有什么官方的定义,代码页也只是微软这个公司的叫法。作为程序员,我们只要知道它们是什么东西,没有必要过多地考证这些名词。
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编码表与编码字库
字符编码详解__彻底理解掌握编码知识,“乱码”不复存在
编码原理之------从原理上搞定编码(***初识编码***),重点为什么又编码?什么是编码?什么是解码?什么是字节流?