偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

什么是“錕斤拷”?我竟答不上來......

開發(fā) 前端
周末女朋友出去逛街了,我自己一個(gè)人在家看綜藝節(jié)目,突然,女朋友給我打來電話。

周末女朋友出去逛街了,我自己一個(gè)人在家看綜藝節(jié)目,突然,女朋友給我打來電話。

[[276072]]
圖片來自 Pexels

 

過了一會(huì),女朋友回來了,她拿出手機(jī),給我看了她在超市拍的照片:

要想知道什么是亂碼,需要先從計(jì)算機(jī)編碼說起。

字符編碼和 ASCII

我們經(jīng)??匆恍┱檻?zhàn)劇,諜戰(zhàn)劇里敵特、地下黨員以及八路軍各部間發(fā)送情報(bào)的時(shí)候,一般都是通過電報(bào)發(fā)送的。

電報(bào)在傳遞的過程中,需要發(fā)報(bào)員用電鍵發(fā)出長(zhǎng)短不一的電碼,收?qǐng)?bào)員就會(huì)聽到電報(bào)機(jī)發(fā)出的滴滴滴答答答的聲音。

其實(shí)電報(bào)發(fā)出的聲音都是"滴"和"答"的組合,"答"的聲音是"滴"的三倍長(zhǎng)。

[[276082]]

發(fā)報(bào)員要先通過一種方式,將想要發(fā)送的情報(bào)轉(zhuǎn)成電報(bào)的滴答聲,收?qǐng)?bào)員在聽到滴答聲之后,再將它們翻譯成正常的文字。這個(gè)過程就是字符編碼和字符解碼。

諜戰(zhàn)劇中將情報(bào)轉(zhuǎn)成電報(bào)的"滴"和"答"聲主要通過摩爾斯電碼,這是一種通過不同的排列順序來表達(dá)不同的英文字母、數(shù)字和標(biāo)點(diǎn)符號(hào)的字符編碼方式。

莫爾斯電碼由短的和長(zhǎng)的電脈沖(稱為點(diǎn)和劃)所組成。點(diǎn)和劃的時(shí)間長(zhǎng)度都有規(guī)定,以一點(diǎn)為一個(gè)基本單位,一劃等于三個(gè)點(diǎn)的長(zhǎng)度。正好對(duì)應(yīng)上電報(bào)的"滴"和"答"。

就像電報(bào)只能發(fā)出"滴"和"答"聲一樣,計(jì)算機(jī)只認(rèn)識(shí) 0 和 1 兩種字符,但是,人類的文字是多種多樣的,如何把人類的文字轉(zhuǎn)換成計(jì)算機(jī)認(rèn)識(shí)的 01 字符呢,這個(gè)過程同樣需要通過字符編碼。

字符編碼(Character encoding)是一套法則,使用該法則能夠?qū)ψ匀徽Z言的字符的一個(gè)集合(如字母表或音節(jié)表),與其他東西的一個(gè)集合(如號(hào)碼或電脈沖)進(jìn)行配對(duì)。

和摩爾斯電碼功能類似,上個(gè)世紀(jì) 60 年代,美國(guó)制定了一套字符編碼,對(duì)英語字符與二進(jìn)制位之間的關(guān)系,做了統(tǒng)一規(guī)定,這被稱為 ASCII 碼,一直沿用至今。

ASCII(American Standard Code for Information Interchange,美國(guó)信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套計(jì)算機(jī)編碼系統(tǒng)。

它主要用于顯示現(xiàn)代英語,其中共有 128 個(gè)字符,包含了所有的大寫和小寫字母,數(shù)字 0 到 9、標(biāo)點(diǎn)符號(hào), 以及在美式英語中使用的特殊控制字符等。

由于 ASCII 只有 128 個(gè)字符,雖然對(duì)于英文字符都可以表示了,但是世界上還有很多其他的文字他是沒辦法表示的,所以需要一種更加全面的字符編碼。

在介紹其他的字符編碼之前,我們先來說一下一個(gè)計(jì)算機(jī)領(lǐng)域通用的字符集。

Unicode

Unicode(中文:萬國(guó)碼、國(guó)際碼、統(tǒng)一碼、單一碼)是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn)。

它對(duì)世界上大部分的文字系統(tǒng)進(jìn)行了整理、編碼,使得計(jì)算機(jī)可以用更為簡(jiǎn)單的方式來呈現(xiàn)和處理文字。

Unicode 至今仍在不斷增修,每個(gè)新版本都加入更多新的字符。目前最新的版本為 2019 年 5 月公布的 12.1,這一版本只新增了 1 個(gè)字符,即日本新年號(hào)令和的合字。

Unicode 備受認(rèn)可,并廣泛地應(yīng)用于計(jì)算機(jī)軟件的國(guó)際化與本地化過程。有很多新科技,如可擴(kuò)展置標(biāo)語言(Extensible Markup Language,簡(jiǎn)稱:XML)、Java 編程語言以及現(xiàn)代的操作系統(tǒng),都采用 Unicode 編碼。

Unicode 是一套通用的字符集,包含世界上的大部分文字,也就是說,Unicode 是可以表示中文的。

UTF-8,UTF-16,UTF-32

Unicode 雖然統(tǒng)一了全世界字符的編碼,但沒有規(guī)定如何存儲(chǔ)。這么做是有考慮的:如果 Unicode 統(tǒng)一規(guī)定,每個(gè)符號(hào)就要用 3 個(gè)或 4 個(gè)字節(jié)表示,因?yàn)樽址啵荒苡眠@么多字節(jié)才能表示完全。

一旦這么規(guī)定,那么每個(gè)英文字母前都必然有 2 到 3 個(gè)字節(jié)是 0,因?yàn)樗杏⑽淖帜冈?ASCII 中都有,都可以用 1 個(gè)字節(jié)表示,剩余字節(jié)位置就要補(bǔ)充 0。

如果這樣,文本文件的大小會(huì)因此大出二三倍,這對(duì)于存儲(chǔ)來說是極大的浪費(fèi)。

為了解決這個(gè)問題,就出現(xiàn)了一些中間格式的字符集,他們被稱為通用轉(zhuǎn)換格式,即 UTF(Unicode Transformation Format)。

常見的 UTF 格式有:

  • UTF-7
  • UTF-7.5
  • UTF-8
  • UTF-16
  • UTF-32

UTF-8:使用 1 至 4 個(gè)字節(jié)為每個(gè)字符編碼,UTF-16:使用 2 或 4 個(gè)字節(jié)為每個(gè)字符編碼,UTF-32:使用 4 個(gè)字節(jié)為每個(gè)字符編碼。

所以我們可以說,UTF-8、UTF-16 等都是 Unicode 的一種實(shí)現(xiàn)方式。

舉個(gè)例子,Unicode 規(guī)定了 1 個(gè)中文字符 "我"對(duì)應(yīng)的 Unicode 是 "\u6211",但是,在 UTF-8 和 UTF-16 等不同的實(shí)現(xiàn)方式下,這個(gè)二進(jìn)制 Code 的存儲(chǔ)方式是不一樣的。

UTF-8 使用可變長(zhǎng)度字節(jié)來儲(chǔ)存 Unicode 字符,例如 ASCII 字母繼續(xù)使用 1 字節(jié)儲(chǔ)存,重音文字、希臘字母或西里爾字母等使用 2 字節(jié)來儲(chǔ)存,而常用的漢字就要使用 3 字節(jié)。輔助平面字符則使用 4 字節(jié)。

GBK,GB2312,GB18030

因?yàn)?UTF-8 是 Unicode 的一種實(shí)現(xiàn),所以他包含了世界上的所有文字的編碼,他采用的是 1-4 字節(jié)進(jìn)行編碼。

對(duì)于那些排在前面優(yōu)先納入的文字,可能就優(yōu)先使用 1 字節(jié)、2 字節(jié)存儲(chǔ)了,對(duì)于后納入的文字,就要使用 3 字節(jié)或者 4 字節(jié)存儲(chǔ)了。

正是因?yàn)樗?,所以那些晚一些納入的字符,在 UTF-8 中的存儲(chǔ)所占的字節(jié)數(shù)可能就會(huì)多一些,那他的存儲(chǔ)空間要求就會(huì)很大。

對(duì)于常用的漢字,在 UTF-8 中采用 3 字節(jié)進(jìn)行編碼,但是如果有一種只包含中文和 ASCII 的編碼的話,就不需要使用 3 個(gè)字節(jié),可能 2 個(gè)字節(jié)就夠了。

對(duì)于大部分網(wǎng)站來說,基本都是只服務(wù)一個(gè)國(guó)家或者地區(qū)的,比如一個(gè)中國(guó)的網(wǎng)站,一般會(huì)出現(xiàn)簡(jiǎn)體字和繁體字以及一些英文字符,很少會(huì)出現(xiàn)日語或者韓文的。

也是出于這樣的考慮,中國(guó)國(guó)家標(biāo)準(zhǔn)總局于 1981 年制定并實(shí)施了 GB 2312-80 編碼,即中華人民共和國(guó)國(guó)家標(biāo)準(zhǔn)簡(jiǎn)體中文字符集。

后來廠商微軟利用 GB 2312-80 未使用的編碼空間,收錄 GB 13000.1-93 全部字符制定了 GBK 編碼。

有了標(biāo)準(zhǔn)中文字符集,如果是一個(gè)純中文網(wǎng)站,就可以采用這種編碼方式,這樣可以大大節(jié)省一些存儲(chǔ)空間的。

常用的中文編碼有 GBK,GB2312,GB18030 等,最常用的是 GBK。

GB2312(1980 年),16 位字符集,收錄有 6763 個(gè)簡(jiǎn)體漢字,682 個(gè)符號(hào),共 7445 個(gè)字符:

  • 優(yōu)點(diǎn):適用于簡(jiǎn)體中文環(huán)境,屬于中國(guó)國(guó)家標(biāo)準(zhǔn),通行于大陸,新加坡等地。
  • 缺點(diǎn):不兼容繁體中文,其漢字集合過少。

GBK(1995 年),16 位字符集,收錄有 21003 個(gè)漢字,883 個(gè)符號(hào),共 21886 個(gè)字符:

  • 優(yōu)點(diǎn):適用于簡(jiǎn)繁中文共存的環(huán)境,為簡(jiǎn)體 Windows 所使用,向下完全兼容 GB2312,向上支持 ISO-10646 國(guó)際標(biāo)準(zhǔn) ;所有字符都可以一對(duì)一映射到 Unicode 2.0 上。
  • 缺點(diǎn):不屬于官方標(biāo)準(zhǔn)和 big5 之間需要轉(zhuǎn)換;很多搜索引擎都不能很好地支持 GBK 漢字。

GB18030(2000 年),32 位字符集;收錄了 27484 個(gè)漢字,同時(shí)收錄了藏文、蒙文、維吾爾文等主要的少數(shù)民族文字:

優(yōu)點(diǎn):可以收錄所有你能想到的文字和符號(hào),屬于中國(guó)最新的國(guó)家標(biāo)準(zhǔn)。

缺點(diǎn):目前支持它的軟件較少。

亂碼

我們還拿前面介紹過的發(fā)電報(bào)的例子來說,假設(shè)有以下場(chǎng)景:發(fā)報(bào)員使用“美式摩爾斯電碼”將情報(bào)轉(zhuǎn)換成電報(bào),收?qǐng)?bào)員接收到電報(bào)之后,通過“現(xiàn)代國(guó)際摩爾斯電碼”進(jìn)行破譯。那么得到的情報(bào)內(nèi)容就可能完全看不懂,這就是亂碼了。

就像在計(jì)算機(jī)領(lǐng)域,我們把一串中文字符通過 UTF-8 進(jìn)行編碼傳輸給別人,別人拿到這串文字之后,通過 GBK 進(jìn)行解碼,得到的內(nèi)容就會(huì)是“錕屆瀿錕斤拷雮傡錕斤拷直錕斤拷錕”,這就是亂碼。

如以下代碼:

  1. public static void main(String[] args) throws UnsupportedEncodingException { 
  2.     String s = "漫話編程!"
  3.  
  4.     byte[] bytes = s.getBytes(Charset.forName("GBK")); 
  5.  
  6.     System.out.println("GBK編碼,GBK解碼:" + new String(bytes, "GBK")); 
  7.  
  8.     System.out.println("GBK編碼,GB18030解碼:" + new String(bytes, "GB18030")); 
  9.  
  10.     System.out.println("GBK編碼,UTF-8解碼:" + new String(bytes, "UTF-8")); 

輸出結(jié)果:

  1. GBK編碼,GBK解碼:漫話編程! 
  2. GBK編碼,GB18030解碼:漫話編程! 
  3. GBK編碼,UTF-8解碼:???????? 

可以看到,將中文字符,通過 GBK 編碼,再使用 UTF-8 解碼,得到的字符就是一串問號(hào),這就是亂碼了。

錕斤拷的前世今生

因?yàn)?Unicode 是一直在更新的,在這個(gè)過程中,肯定有一些比較新的字符他是無法表示的。

或者即使 Unicode 發(fā)布了新版納入了某個(gè)文字,但是很多軟件系統(tǒng)并未升級(jí)也會(huì)有這樣的問題。

就像生活中一些手機(jī)廠商新出的那些 emoji 表情,在自己的手機(jī)上可以正常顯示,發(fā)到其他品牌的手機(jī)上可能就無法顯示。這其實(shí)也是字符集不支持導(dǎo)致的。

發(fā)生以上情況時(shí),無法顯示的時(shí)候也需要有一個(gè)字符來表示的,在 Unicode 中,這個(gè)字符就是 � ,他也是 Unicode 中定義的一個(gè)特殊字符。

也就是"0xFFFD REPLACEMENT CHARACTER",所有無法表示的字符都會(huì)通過這個(gè)字符來表示。

Unicode 官方有關(guān)于這個(gè)符號(hào)的介紹,從上表中可以看到,他的 10 進(jìn)制表示是 65533,在 UTF-8 下,他的 16 進(jìn)制形式是'0xEF 0xBF 0xBD'(三個(gè)字節(jié))。

如果有兩個(gè)連續(xù)的字符都無法顯示,如"� �" ,那么在 UTF-8 編碼下,16 進(jìn)制表示為:

  1. 0xEF 0xBF 0xBD  
  2. 0xEF 0xBF 0xBD 

以上這段編碼,如果放到 GBK 中進(jìn)行解碼的話,因?yàn)?GBK 中一個(gè)漢字兩個(gè)字節(jié),那么結(jié)果就是:

  1. 0xEF 0xBF, 0xBD 0xEF, 0xBF 0xBD 

即:

  1. 0xEFBF 
  2. 0xBDEF 
  3. 0xBFBD 

那么,如果展示出來,就是:錕(0xEFBF),斤(0xBDEF),拷(0xBFBD)。

所以,以后再見到錕斤拷,第一時(shí)間想到 UTF-8 和 GBK 的轉(zhuǎn)換問題準(zhǔn)沒錯(cuò)。

除了錕斤拷以外,還有兩組比較經(jīng)典的亂碼,分別是"燙燙燙"和"屯屯屯",這兩個(gè)亂碼產(chǎn)生自 VC,這是 Debug 模式下 VC 對(duì)內(nèi)存的初始化操作。

VC 會(huì)把棧中新分配的內(nèi)存初始化為 0xcc,而把堆中新分配的內(nèi)存初始化為 0xcd。把 0xcc 和 0xcd 按照字符打印出來,就是燙和屯了。

 

責(zé)任編輯:武曉燕 來源: 漫話編程
相關(guān)推薦

2021-10-18 08:41:06

錕斤拷ASCII編碼

2021-01-26 05:13:12

錕斤拷String 二進(jìn)制

2025-03-28 04:00:00

互聯(lián)網(wǎng)Java讀操作

2024-04-01 08:52:54

CPU網(wǎng)絡(luò)資源

2022-09-01 13:25:54

isEmptyisBlank

2024-09-04 09:32:40

2025-06-24 08:05:00

函數(shù)重載編譯器編程

2024-02-26 08:37:02

Feign項(xiàng)目接口

2011-05-11 18:26:09

網(wǎng)站收錄量

2019-11-18 15:07:54

編程語言C#

2019-06-24 08:32:09

技術(shù)總監(jiān)JavaC++

2021-02-06 09:21:17

MySQL索引面試

2024-03-06 08:00:56

javaAQS原生

2022-04-01 08:37:07

SpringAPI前端

2022-03-21 14:09:19

面試C語言代碼

2019-08-13 21:49:54

編程中文API中文編程

2022-02-22 11:50:16

Python字典代碼

2020-03-16 13:27:47

開發(fā)者產(chǎn)品化系統(tǒng)

2009-05-08 11:10:24

主考官面試求職

2021-07-01 12:10:31

性能優(yōu)化React
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)