《Java编程逻辑》第2章 理解数据背后的二进制

第2章 理解数据背后的二进制

2.1 二进制整数的表示与位运算

2.2 小数的二进制表示

2.3 字符编码与乱码

字符的编码方式有两种,Unicode编码和非Unicode编码。

非Unicode编码

非Unicode编码按时间先后顺序如下。

ASCII码是基础,使用一个字节表示,最高位设为0,其他7为表示128个字符,被其他编码兼容。

西欧主要使用Windows-1252,使用一个字节,增加了额外128个字符。

中国大陆的三个主要编码数GB2312,GBK,GB18030。三个编码有时间先后关系,表示的字符数递增,后面的编码兼容前面的编码。GB2312和GBK使用两个字节表示,GB180303使用2个或4个字节表示。

港澳台主要使用Big5。

除了ASCII码和中国大陆的三个编码之外,编码与编码之间不兼容,强行解析则会出现乱码的问题。

Unicode编码

Unicode编码是为了将世界上所有的字符统一编码,以解决由于编码导致乱码的问题。Unicdoe为世界上所有的字符都分配了一个唯一的数字编号,这个编号的范围从0x000000~0x10FFFF,常用字符在0x0000~0xFFFF之间。每个字符都有一个Unicode编号,这个编号一般写成16进制,前面加上U+。大部分中文的编号范围是U+4E00~U+9FFFF。

Unicode的编码方案主要有三种,UTF-32,UTF-16和UTF-8。编码存在字节序的问题,大端方式使用BE表示,小端方式使用LE表示。

UTF-32使用4个字节来表示一个字符。

UTF-16和UTF-8使用变长字节来表示字符。

乱码

乱码的主要有两种。

  • 解析错误。如Windows-1252编码的文件使用了GB18030来解析。这种方式并没有改变数据的二进制形式,而是改变了解析数据的方式,换回正确的编码即可正常解析。
  • 在错误解析的基础上进行了编码转换。这种方式由于进行了编码转换而改变了数据的二进制形式,而最终会出现无论怎么切换编码方式都无法正常解析。

2.4 char的真正含义

在Java内部进行字符处理时,采用的都是Unicode,具体编码格式是UTF-16BE。

char本是上使用一个固定占用两个字节的无符号正整数,这个正整数对应于Unicode编码,用于表示那个Unicode编号对应的字符。由于固定占用两个字节,char只能表示Unicode编号在65536范围内的字符,而不能表示超出范围的字符,超出范围的字符使用两个char来表示。

猜你喜欢

转载自blog.csdn.net/NelsonCheung/article/details/109913746