操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    其實這是個老生常談的問題了,相信大家在第一次遇到Unicode編碼問題時,都會在網(wǎng)上搜索一通,

    找到幾個解釋,雖然有點雜亂,但還是感覺自己明白了些什么,然后就繼續(xù)忙別的事情.

    而我之所以就這個問題專門寫一篇文章,原因是前兩天在與公司一位有十幾年工作經(jīng)驗的JAVA程序員對接

    API時, 我問他返回的漢字是什么編碼的, 而他回答說"直接返回unicode". 一個如此有經(jīng)驗的老程序員

    對這種基本問題都不甚清楚, 因此我覺得還是有必要好好說一下這個問題的.

    字符集

    在介紹他們之間的區(qū)別時, 我們先講下什么是Unicode. 簡單來說,Unicode是一個字符集(character set),

    和ASCII一樣, 其作用是用一系列數(shù)字來表示字符(character), 這些數(shù)字有時也稱為碼點(code points).

    在PC剛出來的時候,使用英文的幾位先驅(qū)認(rèn)為計算機(jī)需要表示的字符不多,26個英文字母加幾個回車換行等

    特殊符號,總共一百個字符頂天了,于是就有了ASCII. ASCII碼的大小為1個字節(jié),定義了128個字符,

    分別表示為0-127. 比如字符'A'的碼點為65,回車符'\n'的碼點為10, 如下所示:

    當(dāng)然, 后來人們發(fā)現(xiàn), 世界上的字符遠(yuǎn)遠(yuǎn)不止128個, 因此就需要一個新的字符集能表示世上所有的字符,

    包括一個英文字符,一個漢字字符,一個象形文字等. 這個字符集就是Unicode. Unicode前向兼容了ASCII,

    最多可以表示2^21(大概200萬)個字符,已經(jīng)足夠囊括當(dāng)今所有國家的文字, 如下所示:

    目前unicode字符集表示完所有字符后還有剩余, 這些暫時用不到的部分通常用占位符FFFD表示.

    字符編碼

    有了字符集, 我們現(xiàn)在可以用任意數(shù)字來表示現(xiàn)實中的字符了. 但字符要保存在計算機(jī)中,必須要先經(jīng)過編碼.

    有人問, 數(shù)字直接保存在內(nèi)存里不就行了嗎? 但是用多少個字節(jié)表示一個數(shù)字,以及每個字節(jié)的范圍這都是需要

    預(yù)先約定的,這種約定就叫編碼. 假如我們有四個數(shù)字,1,2,3,4要保存在計算機(jī)里, 如果約定了utf-8編碼,

    那么在內(nèi)存中的表示則如下:

    00000001 00000010 00000011 00000100

    其他的編碼規(guī)則有utf-16,gb2312,gbk等,具體的編碼規(guī)則不在本文的范圍內(nèi),想要深入了解的可以在網(wǎng)上查閱相關(guān)的文檔.

    因此,我們可以看到,如果不按照約定的規(guī)則來解碼,就很有可能無法還原出原來的數(shù)據(jù),也就是我們經(jīng)常遇到的"亂碼".

    下面以幾個例子來簡單說明:

    >>> u'你好'
    u'\u4f60\u597d'
    >>> u'你好'.encode('utf8')
    '\xe4\xbd\xa0\xe5\xa5\xbd'
    >>> u'你好'.encode('gbk')
    '\xc4\xe3\xba\xc3'
    >>> u'你好'.encode('utf8').decode('gbk')
    u'\u6d63\u72b2\u30bd'
    >>> print u'你好'.encode('utf8').decode('gbk')
    浣犲ソ

    如上面的代碼所示, "你好"兩個漢字字符的unicode分別為4f60和597d, utf-8編碼后占6個字節(jié), 而gbk編碼后占4個字節(jié).

    如果用utf8編碼后錯誤地用gbk來解碼, 就會得到3個unicode碼點,分別表示字符,;而如果用gbk編碼后

    錯誤地用utf8來解碼, 則在解碼第二個字符時無法湊夠3個字節(jié), 因此會得到未知的結(jié)果, 甚至?xí)驗閮?nèi)存越界訪問引起程序異常.

    注: 本文的python代碼示例是在Linux Terminal下運行的, 因此默認(rèn)為utf-8編碼, 如果你是在Windows cmd里運行, 則通常默認(rèn)GBK編碼, 因此亂碼會在不同地方出現(xiàn):)

    知道字符編解碼的用法之后,我們就可以解釋一下常見的一些亂碼由來了, 比如在Windows下,未初始化的棧會初始化為0xcc, 未初始化的堆內(nèi)存會初始化為0xcd, 可以看到前者為'燙'的gbk編碼,而后者正好為'屯'的gbk編碼, 如下所示:

    u'\ufffd'
    >>> u'燙'
    u'\u70eb'
    >>> u'燙'.encode('gbk')
    '\xcc\xcc'
    >>> u'屯'
    u'\u5c6f'
    >>> u'屯'.encode('gbk')
    '\xcd\xcd'

    前面也說過, unicode暫時沒用到碼點會用占位符FFFD來表示, 如果這個占位符被錯誤解析, 就會被當(dāng)作有意義的內(nèi)容了:

    >>> u'\uFFFD'.encode('utf8')
    '\xef\xbf\xbd'
    >>> u'錕斤拷'.encode('gbk')
    '\xef\xbf\xbd\xef\xbf\xbd'
    >>> print (u'\uFFFD'.encode('utf8')*2).decode('gbk')
    錕斤拷

    可以看到,漢字"錕斤銬"(Unicode)的gbk編碼分別為\xef\xbf, \xbd\xef和\xbf\xbd, 正好是unicode碼FFFD的utf8編碼 的疊加, 因此如果平時遇到多個utf8編碼的Unicode占位符且不巧用了gbk的方式解碼,那就會看到熟悉的錕斤銬了.

    其他

    在Windows的Notepad.exe中, 保存文件的格式可以看到有如下幾種:

    可剛剛不是說Unicode只是字符集嗎, 為什么上面顯示可以保存為Unicode"編碼"? 好吧, 其實這是Windows在命名上一個操蛋的

    地方. 因為Windows內(nèi)部使用UTF-16小端(UTF-16LE)作為默認(rèn)編碼,并且認(rèn)為這就是Unicode的標(biāo)準(zhǔn)編碼格式. 在Windows的世界中,

    存在著ANSI字符串(在當(dāng)前系統(tǒng)代碼頁中, 不可拓展),以及Unicode字符串(內(nèi)部以UTF16-LE編碼保存). 因此notepad里所說的

    Unicode大端,其實就是UTF16-BE.

    這其實也不怪Windows, 因為這是在Unicode出現(xiàn)的早期設(shè)計的, 那時我們還沒意識到UCS-2的不足, 而且UTF-8還沒有被發(fā)明出來. 這也是為什么Windows對UTF8的支持如此之差的原因之一吧.

    后記

    說了這么多, 現(xiàn)在讓我們回到一開始的問題, 如果有人問你"Unicode,GBK和UTF-8有什么區(qū)別?", 我想你應(yīng)該知道該怎么回答了吧: Unicode是 一種字符集, 而GBK和UTF-8都是編碼, 因此Unicode和后兩者不是一類事物, 是無法進(jìn)行對比的.

    博客地址:

    • pannzh.github.io
    • 有價值炮灰-博客園

    小編想問哪一版Windows 10是100%沒有BUG的?恐怕這樣的問題,微軟斷然無法給出回答。

    在修補(bǔ)了一段時間之后,用戶爆料稱,Win10 v1809依然用起來不省心。

    Reddit開的帖子顯示,多名使用者確認(rèn),系統(tǒng)中存在部分Unicode編碼字符無法顯示的問題,比如知名播放器Foobar 2000中的“星級”。本應(yīng)對應(yīng)U+2606(空心五角星)和U+2605(實心五角星)的評分欄目,現(xiàn)在是“口口口”。

    一位用戶找到的臨時解決辦法是,將播放列表更改為Segoe UI字符。

    因為同樣版本的軟件在Win10 v1803中正常,所以網(wǎng)友紛紛指責(zé)是系統(tǒng)層面出了毛病。

    目前,v1809停留在慢速和發(fā)布預(yù)覽測試通道,消息稱,即將交付給穩(wěn)定通道的用戶。畢竟,作為“十月更新”,離按計劃如期抵達(dá)只有不到8天的時間了。


    結(jié)語:最近微軟不斷發(fā)布要停止對WIN7的更新和支持,還有廠商新硬件硬是逼人使用win10。一面微軟不爭氣,win10頻繁曝光BUG 藍(lán)屏、文件丟失、顯示問題 。小編不禁想說一句微軟你是準(zhǔn)備搞毛?

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有