真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

GBK與UTF-8的區(qū)別是什么

GBK與UTF-8的區(qū)別是什么,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)專(zhuān)注于渦陽(yáng)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供渦陽(yáng)營(yíng)銷(xiāo)型網(wǎng)站建設(shè),渦陽(yáng)網(wǎng)站制作、渦陽(yáng)網(wǎng)頁(yè)設(shè)計(jì)、渦陽(yáng)網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造渦陽(yáng)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供渦陽(yáng)網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

GBK與UTF-8的區(qū)別:

  • GBK是在國(guó)家標(biāo)準(zhǔn)GB2312基礎(chǔ)上擴(kuò)容后兼容GB2312的標(biāo)準(zhǔn)。GBK編碼專(zhuān)門(mén)用來(lái)解決中文編碼的,是雙字節(jié)的。不論中英文都是雙字節(jié)的。支持持簡(jiǎn)體中文。

  • UTF-8 編碼是用以解決國(guó)際上字符的一種多字節(jié)編碼,它對(duì)英文使用8位(即一個(gè)字節(jié)),中文使用24位(三個(gè)字節(jié))來(lái)編碼。

  • 如果是外國(guó)人訪(fǎng)問(wèn)GBK的系統(tǒng),需要下載中文語(yǔ)言包支持。

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

  • 如果主要做中文程序的開(kāi)發(fā),客戶(hù)也主要是中國(guó)用戶(hù)的話(huà)就用GBK,因?yàn)閁TF-8編碼的中文使用了三個(gè)字節(jié),用GBK節(jié)省了空間(兩字節(jié))。

GBK改造成UTF-8的風(fēng)險(xiǎn):

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

  • 如果改造成UTF-8,各業(yè)務(wù)環(huán)節(jié)都要做中文及生僻字的回歸測(cè)試,測(cè)試成本較高。

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

GBK、GB2312等與UTF8之間都必須通過(guò)Unicode編碼才能相互轉(zhuǎn)換:

用UTF-8表示英文字符用1個(gè)字節(jié),表示 中文用3個(gè)字節(jié)。GBK是中國(guó)造的字符編碼標(biāo)準(zhǔn),長(zhǎng)度為2個(gè)字節(jié)。因此,這兩個(gè)字符集進(jìn)行轉(zhuǎn)換,需要中間通過(guò)Unicode編碼進(jìn)行過(guò)渡。

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

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

人們?yōu)槭澜缢凶址季幜舜a,叫做 Unicode(統(tǒng)一字符碼)。在被編了碼的字符中,很多字符是不經(jīng)常使用的,用太長(zhǎng)的字節(jié)表示不但浪費(fèi)內(nèi)存,而且大大降低讀寫(xiě)數(shù)據(jù)庫(kù)的速度(所以高性能的數(shù)據(jù)庫(kù)都以ASCII為基礎(chǔ),比如Oracle數(shù)據(jù)庫(kù)),所以提出了UTF-8(Unicode格式轉(zhuǎn)換器)。

UTF-8很靈活,長(zhǎng)度為1到6個(gè)字節(jié),UTF-8中的8表示1個(gè)字符的長(zhǎng)度至少是8個(gè)比特。

UTF-16比較靈活,長(zhǎng)度為2到4個(gè)字節(jié),UTF-16中的16表示1個(gè)字符的長(zhǎng)度至少是16個(gè)比特。

UTF-32不靈活,長(zhǎng)度固定4個(gè)字節(jié),UTF-32中的32表示1個(gè)字符的長(zhǎng)度至少是32個(gè)比特。

字符集錯(cuò)誤轉(zhuǎn)換導(dǎo)致的問(wèn)題:

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

UTF-8格式編碼的字節(jié)流,按GBK字符集轉(zhuǎn)換為字符串,會(huì)出現(xiàn)亂碼,這很正常。但將其重新轉(zhuǎn)為字節(jié)流,再用UTF-8字符集轉(zhuǎn)為字符串,還是亂碼。這就讓我產(chǎn)生了疑惑,雖然使用錯(cuò)誤的字符集必然導(dǎo)致亂碼,但字節(jié)的信息并沒(méi)有改變,因此再轉(zhuǎn)為字節(jié)流,用正確的字符集解碼,應(yīng)該得到正常的字符串。但事實(shí)是,被錯(cuò)誤字符集轉(zhuǎn)換過(guò)的字符串,無(wú)法恢復(fù)到原來(lái)的字符集。

問(wèn)題的根本原因

  • 造成該問(wèn)題的根源是字節(jié)長(zhǎng)度發(fā)生了變化。

  • 因?yàn)閁TF-8編碼的英文使用一個(gè)字節(jié),中文使用三個(gè)字節(jié),而GBK中英文都是兩字節(jié)。

  • GBK或UTF-8遇到無(wú)法解析的字符時(shí),會(huì)使用特殊的字符代替,因此造成原有字節(jié)信息的丟失,無(wú)法恢復(fù)。

錯(cuò)誤轉(zhuǎn)換的分析

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

對(duì)于一串UTF-8編碼的字節(jié)流,使用GBK進(jìn)行解碼。連續(xù)兩個(gè)大于127的字節(jié)被認(rèn)為是一個(gè)GBK編碼的字符;若只讀到一個(gè)大于127的字節(jié),便發(fā)生錯(cuò)誤,無(wú)法解析。此時(shí),  用字符  '  ?  '  代替錯(cuò)誤字節(jié),ASCII碼是63。

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

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

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

對(duì)于一串GBK編碼的字節(jié)流,使用UTF-8解碼。UTF-8對(duì)于字節(jié)的格式有嚴(yán)格要求,當(dāng)解析某個(gè)字符失敗時(shí),使用  '?'(UTF-8編碼為EF BF BD)代替。

繼續(xù)以  “樊”字為例,其GBK字節(jié)碼為[10110111, 10101110]([B7, AE])。使用UTF-8解碼時(shí),根據(jù)規(guī)則,要求10開(kāi)頭的字節(jié)之前,必須有字節(jié)標(biāo)識(shí)一個(gè)字符的長(zhǎng)度,所以?xún)蓚€(gè)字節(jié)都無(wú)法解析。最后的字符串是??。可以看出,所有的字節(jié)信息都丟失了,因此無(wú)法再使用GBK解析該字符串。

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

str='學(xué)'
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')))


-----
學(xué)
1
b'\xe5\xad\xa6'
b'\xd1\xa7'
b'\xe5\xad\xa6'
2
3

關(guān)于GBK與UTF-8的區(qū)別是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


新聞標(biāo)題:GBK與UTF-8的區(qū)別是什么
本文來(lái)源:http://weahome.cn/article/psiips.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部