嵌入式linux编译中文字符,UTF、GBK等编码以及嵌入式linux支持中文显示-Go语言中文社区...

1 各种字符编码

1.1 ASCII

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

78afb09c34a1d31176f526af93d07bc1.png

b5a381c480666b3d2013569510a5c172.png

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码。

2ef63d45fd5d2b28fa40ae1870889802.png

已知"严"的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

7fb2edb735f6cb4bc782d8961b7e6756.png

2.2 修改busybox shell显示源码

1,修改busybox-1.22.1/libbb/printable_string.c

36fd13502b74d060e55423ef69d561e4.png

331ade8902efad1799e0c50be9a68f24.png

2,修改busybox-1.22.1/libbb/unicode.c

f1dcc770cbb849c6aa125f7cdefbd880.png

3,配置中文支持

f2c2682b49c52829ea769767e73831ac.png

3 vi中文显示

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

da35996c203b6748d4db9bfd9d594066.png

4 U盘路径中文显示

前面几步完成过后在挂载的U盘中有中文路径的还是无法正常显示,需要修改挂载参数,因为一般我们的U盘都是Windows下拷贝文件,编码一般用的GBK编码,所以我们让U盘也是按照这个编码来挂载

在自动挂在脚本/bin/hotplug.sh 中的挂载命令-o后面加入iocharset=gb2312,采用此编码挂载既可以显示中文路径

5 QT程序显示中文

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

27d9f04df03b88f9f7b72e0b856db69c.png

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

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

比如使用FTP软件FlashFXP,根据linux的编码设置站点的编码。

d1e57ee590d415121a3bed6000834171.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值