数码相框_显示文字_字符的编码方式
主要内容如下:
熟悉ASCII/GB2312/Unicode编码
大家都知道,数据传输的是二进制,而字符和汉字却各种各样,所以便通过二进制将字符和汉字编程一个字符集(charset)。
数字 ======>>>> 代表什么 ======>>>> 显示为“什么”
字符编码charset 字体文件
(ASCII,GBK,BIG5) (编码表,字体数据)
字符集的发展历史:
1、开始阶段
欧美人发明计算机,用一个字节(8位里的低7位)来表示字母,这些字母成为ASCII码。
0x61 ------ a 0x41 ------ A
2、随着时代发展
由于ASCII不支持中文,常用汉字有六千多个。中国人也要用电脑,亚非拉人也要用电脑。
- 内地用两字节来表示汉字,用GB2312(GB国标)字符编码来表示哪一个汉字(后来又继续扩展汉字GBK,GBK:国标的扩展)
D6 D0 ------ 中
- 港澳台使用繁体字,用BIG5字符编码来表示哪一个汉字
从BIG5编码表可知,D6D0 ------ 笢
在不同的国家的编码标准都不同,所以在PC机里,使用ANSI来代表他们,比如中文PC机里,ANSI编码代表GBK编码
3、统一世界所有富含
unicode 编码表(用什么数字表示什么字符/字),包括中、日、韩、英文等字符。格式有utf-32、utf-16、utf-8。unicode用数字0-0x10FFFF来映射这些字符。
例子:
ASCII:
用3字节表示一个unicode码:(浪费)。
表示unicode的常用方法:UTF-8,UTF-16LE,UTF-16BE(UTF-8是Unicode的实现方式之一)
UTF-8: a b c ------- EF BB BF 61 62 63(EF BB BF代表它是UTF-8编码格式)
UTF-16LE:a b c ------- FF FE 61 00 62 00 63 00(FF FE代表它是小端的),小端高字节在后面,低字节在前面
UTF-16BE:a b c ------- FE FF 00 61 00 62 00 63(FE FF代表它是大端的),大端高字节在前面,低字节在后面
UTF-8:变长的编码方式
UTF-8的编码规则很简单:
对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
Unicode的多种表现方式:
UTF-8:容错能力高,任何一个字节损坏后,最多只会导致一个编码码位损失,不会链锁错误。用的最广泛,表示纯英文和纯字母时,和ASCII码是一样的,不浪费。
UTF-16:错一个字节,则整个乱码
所以文件格式不同,执行的结果也不同
以下面代码为例:
#include <stdio.h>
int main(int argc, char **argv)
{
int i = 0;
unsigned char *str="abc中";
while (str[i])
{
printf("%02x ", str[i]);
i++;
}
printf("\n");
return 0;
}
然后在PC机上,把该文件另存为ansi.c和utf-8.c,编码分别选择ANSI(GBK编码)和UTF-8
然后拖到linux虚拟机里编译运行:
gcc -o ansi ansi.c
gcc -o utf-8 utf-8.c
如何解决文件格式不同,编码也不同的问题?
我们可以指定字符集(charset),强制使它以什么编码格式解析
gcc //查看gcc使用手册
/charset //搜索charset相关字
找到:
-finput-charset=charset //表示源文件的编码方式, 默认以UTF-8来解析
-fexec-charset=charset //表示可执行程序里的字时候以什么编码方式来表示,默认是UTF-8
指定字符集(charset)
gcc -finput-charset=GBK -fexec-charset=UTF-8 -o utf-8_2 ansi.c
如上图所示,通过参数,告诉gcc该文件是GBK编码,需要转换为UTF-8编码后,再编译,便解决了文件格式问题。