中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

GBK與UTF-8的區別是什么

發布時間:2021-10-20 16:20:11 來源:億速云 閱讀:1078 作者:柒染 欄目:大數據

GBK與UTF-8的區別是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

GBK與UTF-8的區別:

  • GBK是在國家標準GB2312基礎上擴容后兼容GB2312的標準。GBK編碼專門用來解決中文編碼的,是雙字節的。不論中英文都是雙字節的。支持持簡體中文。

  • UTF-8 編碼是用以解決國際上字符的一種多字節編碼,它對英文使用8位(即一個字節),中文使用24位(三個字節)來編碼。

  • 如果是外國人訪問GBK的系統,需要下載中文語言包支持。

  • GBK包含全部中文字符(含生僻字);UTF-8則包含全世界所有國家需要用到的字符。

  • 如果主要做中文程序的開發,客戶也主要是中國用戶的話就用GBK,因為UTF-8編碼的中文使用了三個字節,用GBK節省了空間(兩字節)。

GBK改造成UTF-8的風險:

  • 最早使用GB2312,歷史上遇到過中文生僻字亂碼的問題(主要是客戶姓名,起名字時為了一些好彩頭會選一些生僻漢字),后改為GBK才完整兼容。

  • 如果改造成UTF-8,各業務環節都要做中文及生僻字的回歸測試,測試成本較高。

  • 我們還是推薦客戶安裝中文語言包的支持,目前外資客戶,都選擇安裝了中文語言包。

GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉換:

用UTF-8表示英文字符用1個字節,表示 中文用3個字節。GBK是中國造的字符編碼標準,長度為2個字節。因此,這兩個字符集進行轉換,需要中間通過Unicode編碼進行過渡。

  • GBK、GB2312 ----》Unicode ----》UTF8

  • UTF8 ----》 Unicode ----》GBK、GB2312

人們為世界所有字符都編了碼,叫做 Unicode(統一字符碼)。在被編了碼的字符中,很多字符是不經常使用的,用太長的字節表示不但浪費內存,而且大大降低讀寫數據庫的速度(所以高性能的數據庫都以ASCII為基礎,比如Oracle數據庫),所以提出了UTF-8(Unicode格式轉換器)。

UTF-8很靈活,長度為1到6個字節,UTF-8中的8表示1個字符的長度至少是8個比特。

UTF-16比較靈活,長度為2到4個字節,UTF-16中的16表示1個字符的長度至少是16個比特。

UTF-32不靈活,長度固定4個字節,UTF-32中的32表示1個字符的長度至少是32個比特。

字符集錯誤轉換導致的問題:

UTF8字符串-->轉字節流-->按GBK轉字符串(亂碼)-->再轉回字節流-->按UTF8轉字符串(仍然亂碼了)

UTF-8格式編碼的字節流,按GBK字符集轉換為字符串,會出現亂碼,這很正常。但將其重新轉為字節流,再用UTF-8字符集轉為字符串,還是亂碼。這就讓我產生了疑惑,雖然使用錯誤的字符集必然導致亂碼,但字節的信息并沒有改變,因此再轉為字節流,用正確的字符集解碼,應該得到正常的字符串。但事實是,被錯誤字符集轉換過的字符串,無法恢復到原來的字符集。

問題的根本原因

  • 造成該問題的根源是字節長度發生了變化。

  • 因為UTF-8編碼的英文使用一個字節,中文使用三個字節,而GBK中英文都是兩字節。

  • GBK或UTF-8遇到無法解析的字符時,會使用特殊的字符代替,因此造成原有字節信息的丟失,無法恢復。

錯誤轉換的分析

UTF-8(三字節) → GBK(兩字節)

對于一串UTF-8編碼的字節流,使用GBK進行解碼。連續兩個大于127的字節被認為是一個GBK編碼的字符;若只讀到一個大于127的字節,便發生錯誤,無法解析。此時,  用字符  '  ?  '  代替錯誤字節,ASCII碼是63。

以  “樊”字為例,UTF-8編碼使用三個字節表示該字符,字節碼為[11100110, 10101000, 10001010]([e6, a8, 8a])。使用GBK解碼時,讀到第一個字節大于127,則取兩個字節解析為一個GBK字符。前兩個字節e6 8a被解析為GBK字符——妯。 第三個字節無法解析,所以賦值為?,最后的結果是  ?。

可以看出,最后一個字節的信息丟失了,由  8a變成  3F,即使把結果再轉換為字節流,也無法用utf-8字符集正確解析了。

GBK(兩字節) → UTF-8(三字節)

對于一串GBK編碼的字節流,使用UTF-8解碼。UTF-8對于字節的格式有嚴格要求,當解析某個字符失敗時,使用  '?'(UTF-8編碼為EF BF BD)代替。

繼續以  “樊”字為例,其GBK字節碼為[10110111, 10101110]([B7, AE])。使用UTF-8解碼時,根據規則,要求10開頭的字節之前,必須有字節標識一個字符的長度,所以兩個字節都無法解析。最后的字符串是??。可以看出,所有的字節信息都丟失了,因此無法再使用GBK解析該字符串。

注意,UTF-8用?替換,是以字符為單位的。例如[11100110, 10101000, 01000001]使用UTF-8解碼,得到的結果是?A,而不是??A。根據第一個字節的格式,UTF-8期望將三個字節轉換為一個字符。但最后一個字節不符合要求,所以前兩個字節被一個?代替。而不是每個字節都被?代替。

str='學'
print(str)
print(len(str))
print(str.encode())
print(str.encode('GBK'))
print(str.encode('UTF-8'))
print(len(str.encode('GBK')))
print(len(str.encode('UTF-8')))


-----
學
1
b'\xe5\xad\xa6'
b'\xd1\xa7'
b'\xe5\xad\xa6'
2
3

關于GBK與UTF-8的區別是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

天峻县| 菏泽市| 乌兰察布市| 淅川县| 安义县| 布尔津县| 眉山市| 清流县| 隆尧县| 资溪县| 德惠市| 通州市| 和平县| 南郑县| 留坝县| 准格尔旗| 澄江县| 普洱| 大理市| 都江堰市| 化州市| 九江县| 平阴县| 三明市| 长子县| 保定市| 耒阳市| 依兰县| 安康市| 金乡县| 石台县| 云龙县| 义马市| 治多县| 乐陵市| 隆安县| 东乌| 松阳县| 巩义市| 荔波县| 阜城县|