string java getbytes_从 String.getBytes 理解 Java 编码和解码
原碼,補碼,反碼
因為原碼,補碼,反碼比較簡單,我這里粘貼一個例子進行展示。
Unicode 和 UTF-8 的關(guān)系
Uincode 是一個字符集。它規(guī)定了我們使用到的字或符號的碼點(code point)。碼點使用 16 進制保存。
Uincode 字符集規(guī)定 一 的碼點為 4E00。
Uincode 字符集規(guī)定 丁 的碼點為 4E01。
計算機呢只能識別二進制的 0 和 1。而 UTF-8 指的是編碼規(guī)則,規(guī)定碼點怎么保存成二進制。
還有別的 Unicode 編碼規(guī)則,UTF-16 和 UTF-32。
上述表格簡單描述了Unicode 按 UTF-8 編碼的格式。首先將 16 進制的碼點,通過進制轉(zhuǎn)換 為十進制
然后使用十進制的數(shù)字查找上述表格處于哪個范圍中,得出編碼規(guī)則。
然后將碼點轉(zhuǎn)換為 2 進制,從低位到高位替換 x 即可得到字二進制的原碼
將二進制的原碼轉(zhuǎn)換為補碼存儲。
java 內(nèi)存中的字符串采用的是 unicode 編碼,也就是內(nèi)編碼。我們可以從 unicode 轉(zhuǎn)變?yōu)?GBK 或 UTF-8 等其它規(guī)則。
代碼驗證猜想
以趙為例子講解。
趙的碼點為:8D75
16 進制的碼點轉(zhuǎn)換為 10 進制:36213
36213 處于 2048-65535 ,得出對應(yīng)的 UTF-8 編碼格式為:1110xxxx 10xxxxxx 10xxxxxx
趙的 16 進制碼點 8D75 轉(zhuǎn)換為二進制 1000
將二進制填充在 1110xxxx 10xxxxxx 10xxxxxx 中的 x 中,不足的補 0.
11101000 10110101 10110101。
對三個字節(jié)分別求補碼為:
原碼:11101000 10110101 10110101
補碼:10011000 11001011 11001011
補碼對應(yīng) java 中的字節(jié)數(shù)組為:{-24,-75,-75
再加一個例子:
且的碼點:4E14
16 進制的碼點轉(zhuǎn)換為 10 進制:19988
19988 處于 2048-65535 ,得出對應(yīng)的 UTF-8 編碼格式為:1110xxxx 10xxxxxx 10xxxxxx
16 進制的碼點轉(zhuǎn)換成二進制:100111000010100
原碼:11100100 10111000 10010100
補碼:10011100 11001000 11101100
補碼對應(yīng)的字節(jié)數(shù)組為:{-28,-72,-108}
GBK 轉(zhuǎn)碼
趙的 GBK 碼點為:D5D4 十六進制碼點轉(zhuǎn)換為二進制:11010101 11010100 源碼:11010101 11010100 補碼:10101011 10101100
補碼對應(yīng)的字節(jié)數(shù)組為:{-43,-44}
JAVA 中亂碼問題
java 字符或字符串采用 uincode 作為內(nèi)編碼。
編碼:字符串到字節(jié)。
解碼:字節(jié)到字符串。
當我們讀取文件的時候?qū)嶋H讀取的是字節(jié)。然后根據(jù)文件的編碼格式,將字節(jié)解碼成字符串。亂碼問題容易出現(xiàn)的地方就是這里。
不要妄想將一個亂碼的字符串變成一個非亂碼的。這個思路是錯誤的。應(yīng)該從亂碼之前的字節(jié)著手處理。
上述例子中的 s 已經(jīng)亂碼了,當你操作這個 s 獲取字節(jié)也是亂碼的。
因此思路是操作 gbks 轉(zhuǎn)換解碼方式獲取字符串。
總結(jié)
以上是生活随笔為你收集整理的string java getbytes_从 String.getBytes 理解 Java 编码和解码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java win7 jdk_WIN7下配
- 下一篇: hive 表存储大小_Hive中文件存储