嵌入式Linux系列project->数码相框_02_字符编码方式
-
计算机文字编码方式
计算机内部只能识别0和1,也就是说像各计算机系统显示的汉字、字母是由0和1编码而成;计算机是美国人发明的,他们要在计算机上显示字母,那很简单,发明了ASCII码(美国标准信息交换码),该码用一个字节表示,低7位表示字母:字母’a’的ASCII码为0x61, 字母’A’的ASCII码为0x41。例如:我们在UltraEdit软件中输入一段英文:hello world 再显示它的十六进制码:
可以发现它是ASCII编码显示的,也就是说在嵌入式开发板上要显示这些英文信息就得使用ASCII,根据编码再从字体文件中找到对应字体最后显示在LCD上。但ASCII显示英文没问题,但随着发展,计算机逐渐流入中国大陆、台湾等地区,这就导致很多不同的字符集(charset)的出现,像GB2312、GBK、BIG-5等,一个问题是:GBK字符集的汉字在BIG-5字符集里就会变成其它字,也就是编码的不同,导致不同字符集的机器上显示会不一样。
之后呢也就有了统一的规范编码表-Unicode,Unicode是一种数值,它是很多种语言的编码集,常用3字节表示一个Unicode码:
这是utf-16小端存储方式编码,FF FE表示数据存储为小端模式,61 00表示字母‘a’,2D4E表示汉字“中”。
这是utf-16大端存储方式编码,FE FF表示数据存储为大端模式,00 61表示字母‘a’,4E2D表示汉字“中”。可见当存储汉字时用了两字节,而存储英文字母时也用了两字节,高位的一个字节就浪费掉了,则还有一种编码解决该问题-utf-8:
我们可以看到,这种格式的编码在存储字母时只用了一个字节,而存储汉字用了标准的三字节,顾名思义该编码是可变长的,前面的EF BB BF就告诉机器,我这个编码是utf-8的,机器就会根据utf-8的编码格式进行解码,(“中”)E4 B8 AD的二进制表示如下:
1110 0100 1011 1000 1010 1101 最高三位有三个1表示3字节表示该字符或汉字。
Unicode部分编码表:
BIG-5部分编码表:
ASCII部分编码表:
-
文字在C程序中的表示:
源文件用不同的方式编写,会导致执行结果不一样。解决这种问题需要在编译程序时指定字符集:
我们在Linxu shell环境下输入man gcc&&/charset 意思为查看gcc手册并搜索charset(字符集)。
-finput-charset=charset 表示文件的编码方式,默认以UTF-8来解析
-fexec-charset=charset 表示可执行程序里的字符以什么编码方式来表示,默认是UTF-8gcc -o a a.c
执行utf-8_2和asci两个程序并对比:
两个程序都是以asci.c为源文件进行编译的,utf-8_2是编译时指定了字符集-fexec-charset=UTF-8的应用,而asci编译时没有指定字符集,执行程序后发现指定了字符集的应用和urf-8源文件读入的应用一样,也就成功修改了应用程序的字符集表示。参考资料:
BIG5编码表
http://wenku.baidu.com/view/9bb3ae01b52acfc789ebc970.htmlUNICODE编码表
http://wenku.baidu.com/view/7c667f563c1ec5da50e27069.html