1. 程式人生 > >通過查看編碼映射表確定編碼類型

通過查看編碼映射表確定編碼類型

src 能說 映射 encode 字符 編碼 pan 技術 其中

如何判斷字符串是由何種編碼編寫的呢?最簡單粗暴的方法是靠字節個數來判斷,直接上代碼:

# _*_coding:utf-8_*_

s = 編程

s1 = s.decode(utf-8)  # 將s抓換成換成unicode編碼
s2 = s1.encode(utf-8)  # 將s1從unicode轉換成utf-8
s3 = s1.encode(gbk)  # 將s2從unicode換換成gbk

print(s2, s3, s1)  # (‘\xe7\xbc\x96\xe7\xa8\x8b‘, ‘\xb1\xe0\xb3\xcc‘, u‘\u7f16\u7a0b‘)

需要註意的事s1,s2,s3放在一起就會打印出16進制字節,這是內置方法。第一個占3個字節可以推斷出是utf-8,第二個占2字節可以推斷出是gbk。第三個可以在unicode映射表中直接查出來。其中u代表unicode,每2個代表1個字節。

編,7f16

技術分享圖片

程,7a0b

技術分享圖片

編程對應的gbk編碼是\xb1\xe0\xb3\xcc,但是和7f16,7a0b對不上,把他們轉成二進制並把開頭的1去掉(從高字節變成低字節)得到3160和334c。

# 編 7f16(unicode的值)  G0-3160(gbk的值)
# \xb1\xe0  1和0對上了 

# b       1
# 1011    0001
# 把第一位變成0
# 0011    0001 -> 轉換成10進制  3 1

# e       0
# 1110    0000
# # 把第一位變成0
# 0110    0000 -> 轉換成10進制  6 0

# 程 7a0b  G0-334C
# xb3\xcc  3和c對上了
# b 3 # 1011 0011 # # 把第一位變成0 # 0011 0011 -> 轉換成10進制 33 # c c # 1100 1100 # # 把第一位變成0 # 0100 1100 -> 轉換成10進制 4c

可以看到對上了。原因是GBK兼容ASCII碼,1個字節是英文,2個字節是中文。那麽2個字節連到一起的話,如何判斷是中文還是英文呢?由於在ASCII碼中,0-127是常用的,128-255是一些亂七八糟、不常用的擴展表,所以,幹脆從128開始就代表中文。所以,2個字節連在一起,如果每個字節的第1位(也就是相當於128的那個2進制位)如果是1,就代表這是個中文,這個首位是128的字節被稱為高字節。那為什麽\xb1\xe0要把128所在的位去掉(把1變成0)才能與unicode的G0-3160對上呢?這只能說是unicode在映射表的表達上直接忽略了高字節,但真正映射的時候 ,肯定還是需要用高字節的。

技術分享圖片

通過查看編碼映射表確定編碼類型