编码问题笔记
1:JVM存儲格式:JVM中,數(shù)據(jù)都是二字節(jié)存儲的。int、byte等一字節(jié)長的數(shù)據(jù)在Java中也是以兩字節(jié)存儲,高八位是0。而long、double則是真正的兩字節(jié)數(shù)據(jù)類型。
?
2:JVM讀寫數(shù)據(jù)時(shí),先讀寫低八位,再讀寫高八位,所以long、double兩字節(jié)數(shù)據(jù)的讀寫分兩步進(jìn)行,故不是原子性的,而單字節(jié)長的數(shù)據(jù)則由于高八位無影響,所以是原子性的。
?
3:亂碼的原因:在IDE中,按照IDE的編碼類似顯示;存到文檔中,按照文檔的編碼成byte序列存儲;讀到系統(tǒng)中、項(xiàng)目中、瀏覽器中,則按照所處環(huán)境解碼顯示。
? ? ?以上三者,一旦出現(xiàn)中間有不一致的。例如:A格式編碼得到的byte序列,讀取到瀏覽器后以B格式解碼顯示,就會亂碼。
4:GBK編碼:中文存儲占2字節(jié),英文1字節(jié)。
?
5:UTF-8編碼:中文存儲占3字節(jié),英文1字節(jié)。
?
6:Java是雙字節(jié)編碼,稱為 utf-16be:在Java中無論中文還是英文字符都是2字節(jié)長。
?
7:避免亂碼:讀取的字節(jié)序列是什么格式編碼的,就按什么方式解碼:
String str=new String(byte[],"encoding");? 如果不指明解碼格式,則按照IDE項(xiàng)目的默認(rèn)編碼方式來解碼該byte[]來生成字符串。
?
8:文本文檔是存儲的是字節(jié)序列,可以存儲任意編碼格式的字節(jié)序列。
? ? 在中文機(jī)器創(chuàng)建的文本文檔,默認(rèn)編碼方式是ANSI,如果放其他編碼格式的,則顯示亂碼。(因?yàn)轱@示就是解碼)
?
總結(jié)
- 上一篇: 关于C语言底层
- 下一篇: macOS上,实现Wireshark手机