编码问题笔记

1:JVM存储格式:JVM中,数据都是二字节存储的。int、byte等一字节长的数据在Java中也是以两字节存储,高八位是0。而long、double则是真正的两字节数据类型。

2:JVM读写数据时,先读写低八位,再读写高八位,所以long、double两字节数据的读写分两步进行,故不是原子性的,而单字节长的数据则由于高八位无影响,所以是原子性的。

3:乱码的原因:在IDE中,按照IDE的编码类似显示;存到文档中,按照文档的编码成byte序列存储;读到系统中、项目中、浏览器中,则按照所处环境解码显示。

     以上三者,一旦出现中间有不一致的。例如:A格式编码得到的byte序列,读取到浏览器后以B格式解码显示,就会乱码。

4:GBK编码:中文存储占2字节,英文1字节。

5:UTF-8编码:中文存储占3字节,英文1字节。

6:Java是双字节编码,称为 utf-16be:在Java中无论中文还是英文字符都是2字节长。

7:避免乱码:读取的字节序列是什么格式编码的,就按什么方式解码:

String str=new String(byte[],"encoding");

  如果不指明解码格式,则按照IDE项目的默认编码方式来解码该byte[]来生成字符串。

8:文本文档是存储的是字节序列,可以存储任意编码格式的字节序列。

    在中文机器创建的文本文档,默认编码方式是ANSI,如果放其他编码格式的,则显示乱码。(因为显示就是解码)

原文地址:https://www.cnblogs.com/ygj0930/p/6648261.html