嵌入式project_数码相框_02_字符编码方式

嵌入式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-8

    gcc -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.html

    UNICODE编码表
    http://wenku.baidu.com/view/7c667f563c1ec5da50e27069.html

    ASCII编码表
    http://tool.oschina.net/commons?type=4

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值