字符的编码方式很多种 ,我们常用到的是ASCII 、GBK 、UTF-8 、Unicode 、Unicode big endian等。
想查看的话,可以用记事本新建一个txt文档,里面输入字符或汉字,然后用UltraEdit打开,按
CTRL+h,即可查看字符的编码值。
对于英文字符,ASCII编码方式就可以全部表示,只需要0-127这128个编码值。所以ASCII编码值小于0x80,
常见的ASCII码值如:0表示NULL,10表示'\n'换行,0x61表示‘a'等。
对于汉字,大陆地区的简体中文使用的编码方式是GBK,意思是国标扩展码。
香港和台湾的繁体字使用是BIG5。
大陆地区默认情况下,你新建的txt文档存储方式是ANSI,表示英文字符存储为ASCII值,中文和标点符号
存储为GBK值。
为了使全世界所有的国家的任一字符都有一个独一无二的编码值,产生了Unicode码。任一字符的Unicode
值都是唯一的,但是可以有不同的存储方式。UTF-8 、Unicode 、Unicode big endian都是Unicode的一种
存储方式。
比如:"ab中国"’,在记事本里另存为Unicode编码,查看编码值为
FF FE 6100 62 00 63 2D 4E FD 56
FF FE 表示是Unicode编码,'a'的Unicode值为0x0061,和ASCII码值相同,只是表示位数不同。
Unicode编码方式默认是little endian 存放方式。
如果是编码方式选择为Unicode big endian,则存放为
FE FF 00 61 00 62 4E 2D 56 FD
起始两个字节FE FF表示大端方式,大端方式只是存放顺序发生改变,值并没有改变。
下面看看UTF-8编码值
EF BB BF 61 62 E4 B8 AD E5 9B BD
EF BB BF 表示UTF-8编码
E4 B8 AD表示‘中’,UTF-8编码值需要转化为Unicode编码值才能知道其表示的字符。
1110 0100 1011 1000 1010 1101
0100 1110 0010 1101
4 E 2 D
转换方式:第一个字节E4的从最高位开始,出现0之前的1的个数,表示有几个字节来表示。这个1110 0100
0之前有3个1,表示用三个字节来表示。后面的字节的高两位10都是头部,去掉,然后按从高到低顺序组合起
来就是Unicode值。
同一个字符的GBK的值和Unicode值是不同的,同样是上面几个字符,GBK编码方式存放值为:
61 62 D6 D0 B9 FA
'中’的GBK为0xD6D0,和Unicode码值0x4E2D不同。
以16*16汉字库为例,有区号和位号,每个区有94个位,D6对应区号,D0对应位号。假设一个汉字库的内存
映射起始位置为HZKmem,区号area=0xD6-0xA1,位号where=0xD0-0xA1,16*16点阵每一个汉字需要32个
字节表示,那么 ‘中’ 的点阵信息起始位置Buffer,从Buffer开始的32个字节表示了 '中',前两个字节显示为
第一行,依次类推。
Buffer=HZKmem+((0xD6-0xA1)*94+(0xD0-0xA1))*32
在文字显示的时候,如果是点阵显示,一般我们需要取出其ASCII码值和GBK编码值,然后英文到ASCII对应的
点阵取出。汉字的话根据GBK编码值到汉字点阵库中索引出点阵信息。英文字符和中文字符的判断可以通过
编码值来判断,英文字符编码值小于0x80,GBK编码值的第一个字节的最高位为1,所以第一个字节大于等于
0x80。
如果要显示矢量字体,字体大小可任意调整,可以显示不同的字体(楷书、隶书等),则需要用Unicode编码值
索引。
GBK值不可直接索引FreeType矢量字体,如果要想显示成矢量字体的话,需要建立GBK和Unicode之间的对应,
然后再索引。