一个字符在内部表示成 unicode codepoint,对于单字节的字符来说,它就是 ASCII 码,对于多字节来说就很复杂的编码,它就是一个代码表,就像查字典,像我们以前的高考时填写的区位码,就是知道横纵坐标后就能查到值,这就是 unicode,但 unicode 本身是多字节支持的编码方案,由于多个字节在网络上传输或保存到磁盘上是按一个字节一个字节来保存的,这就存在先保存字节还是低字节的问题还有一个问题是一直使用字节数来编码字符还是变长字节来编码字节(比如为了兼容性,单字节依然是一个字节保存,其它常见自然语言的字符用双字节,很少见的冷僻字用多字节编码)这也需要让程序知道哪个字节是分隔点(哪几个字节凑在一起是一个字符),因此有多个编码成字节的方案,比如 UTF-8, UTF-16 之类的,UTF-8 就是变长字节方案,它们都是用一个方法来编码 unicode code point。
至于什么叫 UTF-8 (ASCII 编辑) 这可能你得自己试一下,编辑保存之后,用notepad 打开或 java FileInputStream 按字节读取来观察一下它与 Unicode 编辑有什么不同。Windows 上的 notepad 记事本本身只支持 ANSI,也就是 ASCII 编辑,就是说把内部编码直接当成 ASCII 字节,不对字节做任何转换编码处理,所以当两个汉字4个字节放在一起,我通过程序删除第2个字节的话,你会发现全成了乱码,因为程序会假设 1 + 3 凑在一起是一个汉字,最后一个4单独成一个汉字,所以都是错误的。而 UTF-8 之类的有一套编码规则,或许能推测出这个数据本身有错误,当通过网络传输时我们就能识别出传输过程中是否有错误发生。