数码相框_显示文字_字符的编码方式(1)

数码相框_显示文字_字符的编码方式

主要内容如下:

熟悉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-8UTF-16LEUTF-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编码后,再编译,便解决了文件格式问题。

猜你喜欢

转载自blog.csdn.net/xiaodingqq/article/details/84890017
今日推荐