UTF、GBK等编码以及嵌入式linux支持中文显示

时间:2024-03-19 22:43:43

1 各种字符编码

1.1 ASCII

     Ascii:ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,采用单字节编码,即一个字符只占用一字节。我们所长用的只有0-127共128个字符,128~255是扩展字符。
UTF、GBK等编码以及嵌入式linux支持中文显示

UTF、GBK等编码以及嵌入式linux支持中文显示

1.2 GB2312,GBK,GB18030

     由于ASCII编码不支持中文,因此,当中国人用到计算机时,就需要寻求一种编码方式来支持中文。
     于是,国人就定义了一套编码规则:当字符小于127位时,与ASCII的字符相同,但当两个大于127的字符连接在一起时,就代表一个汉字,第一个字节称为高字节(从0xA1-0xF7),第二个字节为低字节(从0xA1-0xFE),这样大约可以组合7000多个简体汉字。这个规则叫做GB2312
     但是由于中国汉字很多,有些字无法表示,于是重新定义了规则:不在要求低字节一定是127之后的编码,只要第一个字节是大于127,就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。这种扩展之后的编码方案称之为GBK包括了GB2312的所有内容,同时新增了近20000个新的汉字(包括繁体字)和符号。
GB2312与GBK都是采用双字节编码,GBK兼容GB2312。

GB 18030 与 GB 2312-1980 和 GBK 兼容,共收录汉字70244个。
与 UTF-8 相同,采用多字节编码,每个字可以由 1 个、2 个或 4 个字节组成。
(1) 编码空间庞大,最多可定义 161 万个字符。
(2) 支持中国国内少数民族的文字,不需要动用造字区。
(3) 汉字收录范围包含繁体汉字以及日韩汉字
GB 18030 编码是一二四字节变长编码。
(1) 单字节,其值从 0 到 0x7F,与 ASCII 编码兼容。
(2) 双字节,第一个字节的值从 0x81 到 0xFE,第二个字节的值从 0x40 到 0xFE(不包括0x7F),与 GBK 标准兼容。
(3) 四字节,第一个字节的值从 0x81 到 0xFE,第二个字节的值从 0x30 到 0x39,第三个字节从0x81 到 0xFE,第四个字节从 0x30 到 0x39。

1.3 Unicode

     正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
     可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
     Unicode是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字"严"。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。
     Unicode 是一个字符集,把全世界所有的字符进行了集合,但是具体在存储器中怎么存储它并没有定义。比如说:4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节,你也可以用三个或者四个字节来存储。具体用几个存储,Unicode并没有定义。

1.4 UTF-8(8-bit Unicode Transformation Format)

     随着互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是互联网上使用最广的一种Unicode的实现方式(用1,2,3或者4字节表示一个字符),即最小单位为8位。其他实现包含UTF-16(用2或者4字节来实现)即最小单位为16位;UTF-32(用四字节实现)。
     UTF-8的编码规则很简单,只有二条:
(1) 对于单字节的符号,字节的第一位设为0,后面的7位为这个符号的unicode码,对于因为字母,UTF-8编码和ASCII码是相同的
(2) 对于n字节的符号(n>1),第一字节前n位都设为1,第n+1位都设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
UTF、GBK等编码以及嵌入式linux支持中文显示
     已知"严"的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严"的UTF-8编码是"11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

2 shell中文显示

在shell中有中文路径时显示都是??
从busybox1.17.0之后,shell命令行对中文输入及显示做了强制限制,所以即使内核设置了对中文的支持,但在shell下依然无法显示中文。

内核中配置了中文GB2312的显示。

2.1 先配置终端文本显示设置为GB2312

UTF、GBK等编码以及嵌入式linux支持中文显示

2.2 修改busybox shell显示源码

1,修改busybox-1.22.1/libbb/printable_string.c
UTF、GBK等编码以及嵌入式linux支持中文显示
UTF、GBK等编码以及嵌入式linux支持中文显示
2,修改busybox-1.22.1/libbb/unicode.c
UTF、GBK等编码以及嵌入式linux支持中文显示
3,配置中文支持
UTF、GBK等编码以及嵌入式linux支持中文显示

3 vi中文显示

     Ls命令能够正常显示中文路径,cat中文文本文件也可以正常显示中文,但是vi编辑的时候确还是无法正常显示中文。需要对vi进行配置,增加中文中文支持
UTF、GBK等编码以及嵌入式linux支持中文显示

4 U盘路径中文显示

     前面几步完成过后在挂载的U盘中有中文路径的还是无法正常显示,需要修改挂载参数,因为一般我们的U盘都是Windows下拷贝文件,编码一般用的GBK编码,所以我们让U盘也是按照这个编码来挂载
     在自动挂在脚本/bin/hotplug.sh 中的挂载命令-o后面加入iocharset=gb2312,采用此编码挂载既可以显示中文路径

5 QT程序显示中文

     QT程序为了让文件夹或者文件名显示中文,需要根据文件的编码属性来设置,如果传过去的文件是UTF-8,则设置为UTF-8,是GBK就设置为GBK
UTF、GBK等编码以及嵌入式linux支持中文显示

6 嵌入式linux与Windows互传文件。

     为了简单,可以把嵌入式linux的默认编码设置为GBK,这样Windows和linux传文件直接就能够正常的显示中文名。如果linux设置的为UTF-8,则可以使用专业的互传软件来实现编码的转换。
     比如使用FTP软件FlashFXP,根据linux的编码设置站点的编码。
UTF、GBK等编码以及嵌入式linux支持中文显示