上一節我們點到GBK的轉換,在知識點中,我們提到了十六進位,還有String的byte存儲方式,今天我們來繼續探究GBK相關的知識點
先說兩句任何一個知識點到底層之後,總是比較頭疼的,但是我們要首先有一個清晰的思路和方向,如GBK , 在寫這個系列文章之前,我也僅僅知識他是一種編碼方式,我也和大家一樣,這樣邊寫邊研究,從已知出發,大膽假設,小心求證明。
從已知出發,GBK是一種編碼方式,兩個字節的編碼,一個碼對應一個中文字符。順著這個思路,我們找到了GBK.java 這個類,裡面做了字符的映射關係,然後在裡面,我們看到了 DoubleByte.java這個類,通過這個類名,我們可以猜測,這是做編碼和解碼的實現類。不僅僅是對GBK,而是對所有的雙字節的編碼都會有這些實現,我們只需要把映射關係傳給這個DoubleByte就可以了
如下圖所示:
通過b2c的映射,反過來初始化c2b的映射
編碼和編碼也都先初始化,然後再把映射關係傳遞DoubleByte來操作。
所以順著這個思路,我們就可以點進去源碼看看是怎麼一回事了。
同樣,順著這個思路,其他的雙字節編碼應該也是這樣的,這個就留給各位小夥伴來擴展啦
附加知識點先上一波代碼鎮文章
String s = "術"; byte[] gbks = s.getBytes("GBK"); System.out.println(gbks.toString()); System.out.println(Integer.toBinaryString(-54)); System.out.println(Integer.toBinaryString(-11)); System.out.println(Integer.parseInt("11001010",2)); System.out.println(Integer.parseInt("11110101",2)); System.out.println(Integer.toHexString(202)); System.out.println(Integer.toHexString(245)); System.out.println(Integer.parseInt("caf5", 16));Integer.toHexString 是把一個十進位數用16進位表示
Integer.parseInt 是把一個二進位數轉成10進位
Integer.toBinaryString 這裡是把一個整數按補碼的形式輸出
我知道很多小夥伴看推文時很少拿代碼去運行,只看博主的解釋,這樣很容易被帶到坑裡面去的,所以,這裡,包括以後小刀的文章,會儘量把思路寫下來,但運行和找結論還是要交給各位小夥伴了。
然後 術 這個字的GBK編碼就是51957 .
我知道很多小夥伴看推文時很少拿代碼去運行,只看博主的解釋,這樣很容易被帶到坑裡面去的,所以,這裡,包括以後小刀的文章,會儘量把思路寫下來,但運行和找結論還是要交給各位小夥伴了。
Integer.toBinaryString 這裡是把一個整數按補碼的形式輸出
Integer.parseInt 是把一個二進位數轉成10進位
Integer.toHexString 是把一個十進位數用16進位表示
小夥伴們可以順著這個思路,一步步的往下梳理這個關係,有什麼新發現,歡迎在下面留言給小刀哦
-
插播一條:
主題討論第三期來啦,本期主題討論的主題是,IO,本期的不同之處就是,發言會存檔,和個人微信號綁定,後續可以生成自己的知識網絡圖!來吧,各位小夥伴們!詳情請點擊下面的閱讀原文