欧美18videos极品massage,中文字幕久久精品一区二区三区 ,性xxxxfreexxxxx欧美,最近国语高清免费观看视频,亚洲一卡2卡三卡4卡乱码

  • 歡迎使用超級(jí)蜘蛛池(CJZZC)網(wǎng)站外鏈優(yōu)化,收藏快捷鍵 CTRL + D

计算机编码ASCII、GBK、Unicode、UTF-8和URL编码的区别


在計(jì)算機(jī)中,所有的數(shù)據(jù)在存儲(chǔ)和運(yùn)算時(shí)都要使用二進(jìn)制數(shù)值表示(因?yàn)橛?jì)算機(jī)用高電平和低電平分別表示1和0),而具體用哪些二進(jìn)制數(shù)字表示哪個(gè)符號(hào),當(dāng)然每個(gè)人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規(guī)則,這就是統(tǒng)一編碼的原因。簡(jiǎn)單來說編碼就是字符與數(shù)值的對(duì)應(yīng)關(guān)系。

11.jpg

下面我們?cè)敿?xì)介紹不同編碼的編碼規(guī)則和應(yīng)用。

ASCII編碼

ASCII碼是由美國有關(guān)的標(biāo)準(zhǔn)化組織出臺(tái)的,后來它被國際標(biāo)準(zhǔn)化組織(International Organization for Standardization, ISO)定為國際標(biāo)準(zhǔn),稱為ISO 646標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)統(tǒng)一規(guī)定了常用字符(像a、b、c、d這樣的52個(gè)字母(包括大寫)以及0、1等數(shù)字還有一些常用的符號(hào)(例如:%、!、+等)總共128個(gè)字符)如何用二進(jìn)制數(shù)來表示。ASCII分為標(biāo)準(zhǔn)ASCII 碼使用7 位二進(jìn)制數(shù)組合來表示128種字符和擴(kuò)展ASCII的8 位二進(jìn)制數(shù)組合來表示256種字符。

  • 標(biāo)準(zhǔn)ASCII

0-127所包含的碼稱為標(biāo)準(zhǔn)ASCII編碼,如:空格SPACE是32(二進(jìn)制00100000),大寫的字母a是97(二進(jìn)制01100001)。這128個(gè)符號(hào)(包括32個(gè)不能打印出來的控制符號(hào)),只占用了一個(gè)字節(jié)(8位)的后7位,最前面的一位統(tǒng)一規(guī)定為0。

下面是標(biāo)準(zhǔn)ASCII碼表:

計(jì)算機(jī)編碼ASCII、GBK、Unicode、UTF-8和URL編碼的區(qū)別


  • 擴(kuò)展ASCII碼

后128個(gè)稱為擴(kuò)展ASCII碼。擴(kuò)展ASCII碼允許將每個(gè)字符的第8 位用于確定附加的128 個(gè)特殊符號(hào)字符、外來語字母和圖形符號(hào);

下面是擴(kuò)展ASCII碼表:

計(jì)算機(jī)編碼ASCII、GBK、Unicode、UTF-8和URL編碼的區(qū)別


在python中可以使用內(nèi)置函數(shù)ord()查看單個(gè)字符的ASCII碼,例如:

>>> ord('a')
97

ord() 函數(shù)實(shí)質(zhì)是返回字符的 Unicode 碼對(duì)應(yīng)的十進(jìn)制數(shù)值。例如

>>> ord("國")
22269

另外,ord()逆函數(shù)chr()查看編碼對(duì)應(yīng)的字符,例如:

>>> chr(97)
'a'
>>> chr(22269)
'國'

GBK

由于ASCII編碼是不支持中文的,但又需要尋求一種編碼方式來支持中文。于是,國人就定義了一套編碼規(guī)則:當(dāng)字符小于127位時(shí),與ASCII的字符相同,但當(dāng)兩個(gè)大于127的字符連接在一起時(shí),就代表一個(gè)漢字,第一個(gè)字節(jié)稱為高字節(jié)(從0xA1-0xF7),第二個(gè)字節(jié)為低字節(jié)(從0xA1-0xFE),這樣大約可以組合7000多個(gè)簡(jiǎn)體漢字。這個(gè)規(guī)則叫做GB2312。

由于中國漢字很多,有些字還是無法表示,于是重新定義了規(guī)則:不在要求低字節(jié)一定是127之后的編碼,只要第一個(gè)字節(jié)是大于127,就固定表示這是一個(gè)漢字的開始,不管后面跟的是不是擴(kuò)展字符集里的內(nèi)容。這種擴(kuò)展之后的編碼方案稱之為GBK,包含了GB2312的所有內(nèi)容,同時(shí)新增了近20000個(gè)新的漢字(包括繁體字)和符號(hào)。但是,中國有56個(gè)民族,每個(gè)民族都有自己的文字,所以,對(duì)GBK編碼規(guī)則進(jìn)行了擴(kuò)展,又加了近幾千個(gè)少數(shù)民族的字符,再次擴(kuò)展后得編碼叫做GB18030,GBK字符是被包含在GB18030字符內(nèi)的,與GBK基本向后兼容。GB18030共收錄漢字70,244個(gè).

Python中使用gbk和gb18030編碼'韓'字:

>>> "韓".encode("gb18030")
b'\\xba\\xab'
>>> "韓".encode("gbk")
b'\\xba\\xab'

ANSI

為使計(jì)算機(jī)支持更多的語言,通常使用 0x80~0xFFFF 范圍內(nèi)的2個(gè)字節(jié)來表示1個(gè)字符。比如:漢字 '中' 在中文操作系統(tǒng)中,使用0xD6、0xD0這兩個(gè)字節(jié)存儲(chǔ)。但不同的國家和地區(qū)制定了不同的標(biāo)準(zhǔn),由此產(chǎn)生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的編碼標(biāo)準(zhǔn)。這些使用多個(gè)字節(jié)來代表一個(gè)字符的各種延伸編碼方式,被稱為 ANSI 編碼。在簡(jiǎn)體中文Windows操作系統(tǒng)為中,ANSI 編碼代表 GBK 編碼;在繁體中文Windows操作系統(tǒng)中,ANSI編碼代表Big5;而在日文Windows操作系統(tǒng)中,ANSI 編碼代表 Shift_JIS 編碼。不同 ANSI 編碼之間互不兼容,當(dāng)信息在國際間交流時(shí),無法將屬于兩種語言的文字,存儲(chǔ)在同一段 ANSI 編碼的文本中。ANSI編碼表示英文字符時(shí)用一個(gè)字節(jié),表示中文用兩個(gè)或四個(gè)字節(jié)。

Unicode

因?yàn)槭澜缟嫌泻芏鄧遥總€(gè)國家都定義一套自己的編碼標(biāo)準(zhǔn),結(jié)果相互之間無法解析編碼進(jìn)行通信,所以ISO(國際標(biāo)準(zhǔn)化組織)決定定義一套編碼方案來解決所有國家的編碼問題,這個(gè)新的編碼方案就叫做Unicode。注意Unicode不是一個(gè)新的編碼規(guī)則,而是一套字符集(為每一個(gè)「字符」分配一個(gè)唯一的 ID(學(xué)名為碼位 / 碼點(diǎn) / Code Point)),可以將Unicode理解為一本世界編碼的字典。具體的符號(hào)對(duì)應(yīng)表,可以查詢,或者專門的漢字對(duì)應(yīng)表。

在Python中查看字符對(duì)應(yīng)Unicode數(shù)值的方法:

>>> "中".encode("unicode_escape")
b'\\\u4e2d'
>>> b'\\\u4e2d'.decode("unicode_escape")
'中'

需要注意的是,Unicode 只是一個(gè)符號(hào)集,它只規(guī)定了符號(hào)的二進(jìn)制代碼,卻沒有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ)。比如,漢字嚴(yán)的 Unicode 是十六進(jìn)制數(shù)4E25,轉(zhuǎn)換成二進(jìn)制數(shù)足足有15位(1001110 00100101),也就是說,這個(gè)符號(hào)的表示至少需要2個(gè)字節(jié)。表示其他更大的符號(hào),可能需要3個(gè)字節(jié)或者4個(gè)字節(jié),甚至更多。這里就有幾個(gè)嚴(yán)重的問題,第一個(gè)問題是,計(jì)算機(jī)如何才能區(qū)別 Unicode 和 ASCII ?還有計(jì)算機(jī)怎么知道三個(gè)字節(jié)表示一個(gè)符號(hào),而不是分別表示三個(gè)符號(hào)呢?第二個(gè)問題是,我們已經(jīng)知道,英文字母只用一個(gè)字節(jié)表示就夠了,如果 Unicode 統(tǒng)一規(guī)定,每個(gè)符號(hào)用三個(gè)或四個(gè)字節(jié)表示,那么每個(gè)英文字母前都必然有二到三個(gè)字節(jié)是0,這對(duì)于存儲(chǔ)或傳輸來說是極大的浪費(fèi),文本文件的大小會(huì)因此大出二三倍,這是無法接受的。它們?cè)斐傻慕Y(jié)果是:出現(xiàn)了 Unicode 的多種存儲(chǔ)方式,也就是說有許多種不同的二進(jìn)制格式,可以用來表示 Unicode。也導(dǎo)致了Unicode 在很長一段時(shí)間內(nèi)無法推廣,直到UTF編碼的出現(xiàn)。

UTF-8編碼

由于Unicode比較浪費(fèi)網(wǎng)絡(luò)和硬盤資源,因此為了解決這個(gè)問題,就在Unicode的基礎(chǔ)上,定制了一套編碼規(guī)則(將「碼位」轉(zhuǎn)換為字節(jié)序列的規(guī)則【編碼/解碼 可以理解為 加密/解密 的過程】),這個(gè)新的編碼規(guī)則就是UTF-8。UTF-8采用1-4個(gè)字符進(jìn)行傳輸和存儲(chǔ)數(shù)據(jù),是一種針對(duì)Unicode的可變長度字符編碼,又稱萬國碼。

Unicode與Utf-8編碼規(guī)則:使用下面的模板進(jìn)行互轉(zhuǎn)

Unicode符號(hào)范圍(十六進(jìn)制) | UTF-8編碼方式(二進(jìn)制)

------------------------------------------------------------------------

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110xxxxx 10xxxxxx

0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx\

0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Unicode字符通過對(duì)應(yīng)模板加上標(biāo)志位就后是Utf-8編。例如:"迷" Unicode的編碼為 \\\u8ff7 用二進(jìn)制表示為:?10001111 11110111?,8ff7處于第三個(gè)模板范圍內(nèi),把10001111 11110111 按模板分成三份 1000 111111 110111,然后加上標(biāo)志位的二進(jìn)制為:11101000 10111111 10110111 所以u(píng)tf-8編碼是"?E8BFB7?"

Python中Unicode字符轉(zhuǎn)UTF-8編碼:

>>>'迷'.encode('utf-8')
b'\\xe8\\xbf\\xb7'

那么如何區(qū)分utf-8各個(gè)字符的?utf-8區(qū)分每個(gè)字符的開始是根據(jù)編碼的高位字節(jié)來區(qū)分的,比如:用一個(gè)字節(jié)表示的字符,第一個(gè)字節(jié)高位以"0"開頭;用兩個(gè)字節(jié)表示的字符,第一個(gè)字節(jié)的高位為以"110"開頭,后面一個(gè)字節(jié)以"10開頭";用三個(gè)字節(jié)表示的字符,第一個(gè)字節(jié)以"1110"開頭,后面兩個(gè)字節(jié)以"10"開頭;用四個(gè)字節(jié)表示的字符,第一個(gè)字節(jié)以"11110"開頭,后面的三個(gè)字節(jié)以"10"開頭。這樣計(jì)算機(jī)就可以認(rèn)出每個(gè)字符由幾個(gè)字節(jié)組成,才能顯示出正確的信息。

UTF-8和Unicode轉(zhuǎn)換

比如漢字"智",utf-8編碼是"\\xe6\\x99\\xba"對(duì)應(yīng)的二進(jìn)制為:"11100110 10011001 10111010",由于utf-8中一個(gè)漢字是3個(gè)字節(jié),所以對(duì)應(yīng)的模板為:

0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

11100110 10011001 10111010 | UTF-8編碼成的二進(jìn)制1110xxxx 10xxxxxx 10xxxxxx | 對(duì)應(yīng)模版 0110 011001 111010 |去除模版中的標(biāo)志位后01100110 01111010代表十六進(jìn)制667A,因此根據(jù)規(guī)則轉(zhuǎn)換得出"智"Unicode的編碼為667A。

同樣,根據(jù)Unicode中字符的編碼位置,也能找到對(duì)應(yīng)的utf-8編碼。例如:UTF-8編碼:\\xe8\\xbf\\xb7,用二進(jìn)制表示為:?11101000 10111111 10110111?,有3個(gè)字節(jié)屬于第三個(gè)模板范圍,按模板去掉標(biāo)志位后是:1000 111111 110111,結(jié)果就是'迷'字的Unicode字符 8ff7。

>>> b'\\\u8ff7'.decode('unicode_escape')
'迷'

Unicode與GBK編碼的轉(zhuǎn)換

Unicode 與 GBK 是兩個(gè)完全不同的字符編碼方案, 其兩者沒有直接關(guān)系。如果要對(duì)其進(jìn)行相

互轉(zhuǎn)換, 最直接最高效的方法是查詢各自的字符對(duì)照表。

Python實(shí)現(xiàn)Unicode與GBK轉(zhuǎn)換(將Unicode對(duì)應(yīng)數(shù)值:\\\u8ff7轉(zhuǎn)GBK字符方法):

>>> l_u = b'\\\u8ff7'.decode('unicode_escape')
>>> l_u.encode('gbk')
b'\\xc3\\xd4'

UTF-8、Unicode與GBK的關(guān)系

Utf-8(utf-16)====編碼====Unicode=====編碼=====GBK(ANSI)

Utf-8(utf-16)====解碼====Unicode===解碼=======GBK(ANSI)

總結(jié):Unicode字符可以通過編碼可以得到UTF-8和GBK,相反UTF-8和GBK也可以通過解碼得到Unicode,但GBK和UTF-8之間無法直接轉(zhuǎn)換,只能轉(zhuǎn)換到Unicode后再轉(zhuǎn)到另一編碼。其實(shí)所謂編碼轉(zhuǎn)換是數(shù)值與字符的轉(zhuǎn)換。

URL編碼 /解碼

URL編碼就是一個(gè)字符ascii碼的十六進(jìn)制。不過稍微有些變動(dòng),需要在前面加上"%"。比如"\",它的ascii碼是92,92的十六進(jìn)制是5c,所以"\"的URL編碼就是%5c。那么漢字的URL編碼呢?很簡(jiǎn)單,非ASCII字符的編碼一般有兩種,是以GBK或UTF8進(jìn)行編碼。例如:"迷" 對(duì)應(yīng)的UTF-8編碼\\xe8\\xbf\\xb7,則"胡"的URL編碼是%E8%BF%B7。解碼方法是去掉%,之后再進(jìn)行UTF-8解碼,就可以得到實(shí)際的字符了。

計(jì)算機(jī)是以什么編碼存儲(chǔ)和傳輸數(shù)據(jù)的呢?

支持Unicode的應(yīng)用程序(python、VS、VC、Google Chrome、notepad等大多數(shù)程序都支持(部分程序需要設(shè)置編碼)。

不支持Unicode的應(yīng)用程序(易語言等)則會(huì)以控制面板—區(qū)域—管理中設(shè)置的編碼(ANSI)進(jìn)行存儲(chǔ),例如:簡(jiǎn)體中文(GBK)、繁體中文(Big5)等。

例如:以國產(chǎn)編程語言‘易語言’為例,看一下變量在內(nèi)存中是以什么編碼存儲(chǔ)的

a = "你"
調(diào)試輸出 (取指針地址_文本型 (a))

* 1966420

通過CE查看此內(nèi)存地址中對(duì)應(yīng)的值為0000E3C4,而"你"的GBK編碼正好為:E3C4。由此得知,易語言軟件是以GBK編碼進(jìn)行數(shù)據(jù)存儲(chǔ)和傳輸?shù)摹?/p>

再看看數(shù)據(jù)在內(nèi)存中如何存儲(chǔ):

· 使用OD查看

計(jì)算機(jī)編碼ASCII、GBK、Unicode、UTF-8和URL編碼的區(qū)別


· 使用CE查看

計(jì)算機(jī)編碼ASCII、GBK、Unicode、UTF-8和URL編碼的區(qū)別


多字符變量"你好啊"的GBK字符:c4e3bac3b0a1

OD:

計(jì)算機(jī)編碼ASCII、GBK、Unicode、UTF-8和URL編碼的區(qū)別


CE(8字節(jié)顯示):

計(jì)算機(jī)編碼ASCII、GBK、Unicode、UTF-8和URL編碼的區(qū)別

由此可以看出,內(nèi)存的存儲(chǔ)編碼方式與軟件支持的編碼方式是一致的(易語言:GBK字符;python:Unicode字符);計(jì)算機(jī)內(nèi)存數(shù)據(jù)存儲(chǔ)一般采用大端模式(內(nèi)存高位對(duì)數(shù)據(jù)低位,內(nèi)存低位對(duì)數(shù)據(jù)高位) 。OD默認(rèn)是從內(nèi)存低位到高位顯示數(shù)據(jù),CE默認(rèn)是從內(nèi)存高位到低位顯示數(shù)據(jù),所以看到的十六進(jìn)制數(shù)值是相反的。存儲(chǔ)占用的內(nèi)存大小,會(huì)根據(jù)變量的數(shù)據(jù)類型申請(qǐng)對(duì)應(yīng)大小的內(nèi)存來存儲(chǔ)。

本文鏈接:http://www.azlx8.cn/article/582.html

超級(jí)蜘蛛工具

  • 網(wǎng)站鏈接HTTP狀態(tài)批量檢測(cè)_在線批量檢測(cè)網(wǎng)站鏈接狀態(tài)_超級(jí)蜘蛛池
  • 百度關(guān)鍵詞排名查詢_網(wǎng)站關(guān)鍵詞排名批量查詢_超級(jí)蜘蛛池
  • 百度收錄查詢_在線百度收錄批量查詢_超級(jí)蜘蛛池
  • 域名IP地址批量查詢_在線批量查詢網(wǎng)站IP地址_超級(jí)蜘蛛池
  • 超級(jí)外鏈發(fā)布工具_(dá)在線免費(fèi)批量發(fā)布SEO外鏈_超級(jí)蜘蛛池
  • 網(wǎng)頁蜘蛛模擬抓取測(cè)試工具_(dá)超級(jí)蜘蛛工具_(dá)超級(jí)蜘蛛池