概念浅析:字符集、字符编码、字节序、ASCII、GBK、Unicode、UTF-8、ANSI

概念浅析(一):字符集、字符编码、字节序

字符集 character set:顾名思义,指的是字符集合,它表示在如 简体汉字、繁体汉字、英文、阿拉伯数字、韩文、日文等众多字符中,所能涵盖和表示的字符范围,值得注意的是,虽然通常某个字符集都会有默认的字符编码方式,但严格来说字符集仅仅表示字符集合,并不表示字符的编码方式encoding和存储字节序;

字符编码 encoding,指的是字符的编码规则,包括编码长度是单字节,双字节还是四字节,编码与字符集中字符的对应关系等;

字节序 BYTE-ORDER:big-endian,little-endian,指的是多字节数据的存储顺序,如果字符编码采用多字节方案,则自然涉及到编码数据在内存中的存储顺序,endian指的是多字节数据的尾部字节,也即是低位字节,big/little指的是存储地址,所以big-endian是指多字节数据的低位字节 存储在大地址(高位地址),little-endian指的是低位地址存储低位字节;

DEC (Digital Equipment Corporation,现在是Compaq公司的一部分)和Intel的机器(X86平台)一般采用小端。

IBM, Motorola(Power PC), Sun的机器一般采用大端。当然,这不代表所有情况。有的CPU即能工作于小端, 又能工作于大端, 比如ARM, Alpha,摩托罗拉的PowerPC。 具体情形参考处理器手册。 具体这类CPU是大端还是小端,应该和具体设置有关。(如,Power PC支持little-endian字节序,但在默认配置时是big-endian字节序)。

一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian的。少部分,如MAC OS ,是Big Endian 的。

所以说,Little Endian还是Big Endian与操作系统和芯片类型都有关系。Linux系统中,你可以在/usr/include/中(包括子目录)查找字符串BYTE_ORDER(或_BYTE_ORDER, __BYTE_ORDER),确定其值。BYTE_ORDER中文称为字节序。这个值一般在endian.h或machine/endian.h文件中可以找到,有时在feature.h中,不同的操作系统可能有所不同。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而 J***A编写的程序则唯一采用big endian方式来存储数据。无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。

所以,字符集规定了包含的字符范围,字符编码规定了字符怎么编码表示,字节序规定了字符编码则怎么存储和传输。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页