【转载】计算机程序的思惟逻辑 (8) - char的真正含义

看似简单的charhtml

经过前两节,咱们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,咱们仍是不知道怎么在程序中处理字符和文本。编程

本节讨论在Java中进行字符处理的基础 - char,Java中还有Character, String, StringBuffer, StringBuilder等类进行文本处理,他们的基础都是char,咱们在后续文章中介绍这些类。swift

char看上去是很简单的,正如咱们在第2节所说,char用于表示一个字符,这个字符能够是中文字符,也能够是英文字符。赋值时把常量字符用单引号括起来,例如:编程语言

char c = 'A';
char z = '中';

但咱们在第3节抛出了一个问题,为何字符类型也能够进行算术运算和比较?char的本质究竟是什么呢?ui

char的本质编码

在 Java内部进行字符处理时,采用的都是Unicode,具体编码格式是UTF-16BE。简单回顾一下,UTF-16使用两个或四个字节表示一个字 符,Unicode编号范围在65536之内的占两个字节,超出范围的占四个字节,BE (Big Endian)就是先输出高位字节,再输出低位字节,这与整数的内存表示是一致的。加密

char本质上是一个固定占用两个字节的无符号正整数,这个正整数对应于Unicode编号,用于表示那个Unicode编号对应的字符。code

因为固定占用两个字节,char只能表示Unicode编号在65536之内的字符,而不能表示超出范围的字符。htm

那超出范围的字符怎么表示呢?使用两个char。类String有一些相关的方法,后续文章介绍。blog

在这个认识的基础上,咱们再来看下char的一些行为,就比较容易理解了。

char的赋值

char有多种赋值方式:

  1. char c = 'A'
  2. char c = '马'
  3. char c = 39532
  4. char c = 0x9a6c
  5. char c = '\u9a6c'

第1种赋值方式是最多见的,将一个能用Ascii码表示的字符赋给一个字符变量。

第 2种也很常见,但这里是个中文字符,须要注意的是,直接写字符常量的时候应该注意文件的编码,好比说,GBK编码的代码文件按UTF-8打开,字符会变成乱码,赋值的时候是按当前的编码解读方式,将这个字符形式对应的Unicode编号值赋给变量,'马'对应的Unicode编号是39532,因此第2种赋值和第3种是同样的。

第3种是直接将十进制的常量赋给字符,第4种是将16进制常量赋给字符,第5种是按Unicode字符形式。

以上,2,3,4,5都是同样的,本质都是将Unicode编号39532赋给了字符。

char的运算

因为char本质上是一个整数,因此能够进行整数能够进行的一些运算,在进行运算时会被看作int,但因为char占两个字节,运算结果不能直接赋值给char类型,须要进行强制类型转换,这和byte, short参与整数运算是相似的。

char类型的比较就是其Unicode编号的比较。

char 的加减运算就是按其Unicode编号进行运算,通常对字符作加减运算没什么意义,但Ascii码字符是有意义的。好比大小写转换,大写A-Z的编号是 65-90,小写a-z的编号是97-122,正好相差32,因此大写转小写只需加32,而小写转大写只需减32。加减运算的另外一个应用是加密和解密,将 字符进行某种可逆的数学运算能够作加解密。

char的位运算能够看作就是对应整数的位运算,只是它是无符号数,也就是说,有符号右移>>和无符号右移>>>的结果是同样的。 

char的二进制

既然char本质上是整数,查看char的二进制表示,一样能够用Integer的方法,以下所示:

char c = '马';
System.out.println(Integer.toBinaryString(c));

输出为 1001101001101100

小结

本节介绍了char的本质,它固定占用两个字节,其实是一个整数,表示字符的Unicode编号,不在65536编号内的字符一个char表示不了,须要用两个char。

咱们回顾一下之前全部的章节,整理一下思路。

咱们说,所谓程序,主要就是告诉计算机要对什么数据作什么操做。第1节咱们介绍了如何经过变量定义数据,第2节介绍了数据的第一个操做 - 赋值,第3节介绍了数据的基本运算,第4节到本节介绍了数据的二进制表示及位运算。

至此,咱们能够定义基本数据类型,以及对基本数据进行基本运算了,但实际操做中不是只有运算自己的,咱们须要有表达相似"若是"/"那么"逻辑的机制,即根据具体状况选择执行的机制,也就是流程控制。

相关文章
相关标签/搜索