其实不管是用哪种编码,本质上保存的都是二进制。
一些基本概念与易错点:
- 不同的编码,占用的字节数是不一样的。字符在不同的编码占用的字节是不相同的,一个字节是8位。所以说,你看到的字符串到底占用多少个字节,要取决于到底是用了哪种编码。比如在 GB 2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节。在UTF-8编码中,一个汉字字符储存需要3到4个字节。
- iOS中的NSData其实就是二进制。由于从上面已经知道一个汉字在不同的编码,占用的字节数是不一样的,所以占用的位数也就可能不一样。所以其实不难理解,为什么要是用对应的编码才能转换为正确的字符串了。
- 不要以为保存的数据就肯定能从某种编码中得到正确的字符串,实际上可能对字节数组进行了修改,不再是UTF8编码了。比如:UTF8编码生成的文件,可能由于加密等原因,先转换为字节数组,对字节数组进行了处理了,然后保存。看到的则是乱码了。解码部分,肯定也是对字节数组处理。所以说,如果编码修改了,两边就会无法匹配到一起,假如可以部分匹配到一起,那么可能两种的字母都是占用一个字节,然后汉字字节数不同。
- 一些加密过的数据,如果进行UTF8来解码,又编码,会发现数据导致损坏。比如字节数组修改后,这时实际上用UTF8来解码,得到的字符串实际上已经不是原来的了。比如字节FF和FE在UTF-8编码中永远不会出现,但是由于修改了,出现了这样的字节就会出错。所以导致UTF8先解码,然后编码的结果不一致。
- 看到一样,不代表编码一样。一个汉字不同的编码可能占用不同的字节数,就是说二进制位数不相同。所以文件可能是不同的编码,看到的却是一样的字符串。
- nodejs可以使用iconv-lite来进行编码转换。
- nodejs中buffer类的单位是字节