文本在内存中的编码(1)——乱码探源(4)
让我们从一个故事开始说起。话说北大是很有哲学传统的,当你准备踏进北大校门时,连门卫都会连问你三个终极哲学问题: 你是谁?你从哪里来?你要到哪里去? 那么这与我们的问题又有何关系呢?我觉得理解内存中的编码的关键在于理解String类型,因此我们也来探讨一下String的前世今生:String是谁(什么)?String从哪里来?String到哪里去? 当我们能够清晰地回答这三个终极问题时,对文本在内存中的编码也算理解得差不多了。 注:文中将用Java平台为例来探讨这些问题。 String是什么? 要回答这个问题,源码当然是最好的参考。 字符序列(CharSequence) 如果看String类型的声明: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; // ... } 可以看到它实现了所谓的CharSequence接口,所以它是一个char序列,内部实质是一个char数组。 也即上述代码中的”char value[]“,(也许你觉得”char[] value“的写法更习惯一些,两者是等价的) 如果再看String的length方法,事实就更清楚了,实际上取的是char数组的长度: public