日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

看程序员如何给女朋友解释什么是锟斤拷?

發(fā)布時間:2025/3/16 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 看程序员如何给女朋友解释什么是锟斤拷? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

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

字符編碼和ASCII

我們經(jīng)常看一些諜戰(zhàn)劇,諜戰(zhàn)劇里敵特、地下黨員以及八路軍各部間發(fā)送情報的時候,一般都是通過電報發(fā)送的,電報在傳遞的過程中,需要發(fā)報員用電鍵發(fā)出長短不一的電碼,收報員就會聽到電報機發(fā)出的滴滴滴答答答的聲音。其實電報發(fā)出的聲音都是"滴"和"答"的組合,"答"的聲音是"滴"的三倍長。

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

諜戰(zhàn)劇中將情報轉成電報的"滴"和"答"聲主要通過摩爾斯電碼,這是一種通過不同的排列順序來表達不同的英文字母、數(shù)字和標點符號的字符編碼方式。莫爾斯電碼由短的和長的電脈沖(稱為點和劃)所組成。點和劃的時間長度都有規(guī)定,以一點為一個基本單位,一劃等于三個點的長度。正好對應上電報的"滴"和"答"。

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

字符編碼(Character encoding)是一套法則,使用該法則能夠對自然語言的字符的一個集合(如字母表或音節(jié)表),與其他東西的一個集合(如號碼或電脈沖)進行配對。

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

ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基于拉丁字母的一套計算機編碼系統(tǒng)。它主要用于顯示現(xiàn)代英語,其中共有128個字符,包含了所有的大寫和小寫字母,數(shù)字0到9、標點符號, 以及在美式英語中使用的特殊控制字符等。

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

在介紹其他的字符編碼之前,我們先來說一下一個計算機領域通用的字符集。

Unicode

Unicode(中文:萬國碼、國際碼、統(tǒng)一碼、單一碼)是計算機科學領域里的一項業(yè)界標準。它對世界上大部分的文字系統(tǒng)進行了整理、編碼,使得計算機可以用更為簡單的方式來呈現(xiàn)和處理文字。

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

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

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

UTF-8 UTF-16 UTF-32

Unicode雖然統(tǒng)一了全世界字符的編碼,但沒有規(guī)定如何存儲。這么做是有考慮的:

如果Unicode統(tǒng)一規(guī)定,每個符號就要用三個或四個字節(jié)表示,因為字符太多,只能用這么多字節(jié)才能表示完全。

一旦這么規(guī)定,那么每個英文字母前都必然有二到三個字節(jié)是0,因為所有英文字母在ASCII中都有,都可以用一個字節(jié)表示,剩余字節(jié)位置就要補充0。

如果這樣,文本文件的大小會因此大出二三倍,這對于存儲來說是極大的浪費。為了解決這個問題,就出現(xiàn)了一些中間格式的字符集,他們被稱為通用轉換格式,即UTF(Unicode Transformation Format)。常見的UTF格式有:UTF-7, UTF-7.5, UTF-8,UTF-16, 以及 UTF-32。

UTF-8 使用一至四個字節(jié)為每個字符編碼

UTF-16 使用二或四個字節(jié)為每個字符編碼

UTF-32 使用四個字節(jié)為每個字符編碼

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

舉個例子,Unicode規(guī)定了一個中文字符 "我"對應的unicode是"\u6211",但是,在UTF-8和UTF-16等不同的實現(xiàn)方式下,這個二進制code的存儲方式是不一樣的。

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

GBK,GB2312,GB18030

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

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

正是因為他太全了,所以那些晚一些納入的字符,在UTF-8中的存儲所占的字節(jié)數(shù)可能就會多一些,那他的存儲空間要求就會很大。

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

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

也是出于這樣的考慮,中國國家標準總局于1981年制定并實施了 GB 2312-80 編碼,即中華人民共和國國家標準簡體中文字符集。后來廠商微軟利用GB 2312-80未使用的編碼空間,收錄GB 13000.1-93全部字符制定了GBK編碼。

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

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

  • GB2312(1980年):16位字符集,收錄有6763個簡體漢字,682個符號,共7445個字符;

    • 優(yōu)點:適用于簡體中文環(huán)境,屬于中國國家標準,通行于大陸,新加坡等地也使用此編碼;

    • 缺點:不兼容繁體中文,其漢字集合過少。

  • GBK(1995年):16位字符集,收錄有21003個漢字,883個符號,共21886個字符;

    • 優(yōu)點:適用于簡繁中文共存的環(huán)境,為簡體Windows所使用,向下完全兼容gb2312,向上支持 ISO-10646 國際標準 ;所有字符都可以一對一映射到unicode2.0上;

    • 缺點:不屬于官方標準,和big5之間需要轉換;很多搜索引擎都不能很好地支持GBK漢字。

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

    • 優(yōu)點:可以收錄所有你能想到的文字和符號,屬于中國最新的國家標準;

    • 缺點:目前支持它的軟件較少。

亂碼

我們還拿前面介紹過的發(fā)電報的例子來說,假設有以下場景:

發(fā)報員使用"美式摩爾斯電碼"將情報轉換成電報,收報員接收到電報之后,通過"現(xiàn)代國際摩爾斯電碼"進行破譯。那么得到的情報內(nèi)容就可能完全看不懂,這就是亂碼了。

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

如以下代碼:

public?static?void?main(String[]?args)?throws?UnsupportedEncodingException?{String?s?=?"漫話編程!";byte[]?bytes?=?s.getBytes(Charset.forName("GBK"));System.out.println("GBK編碼,GBK解碼:"?+?new?String(bytes,?"GBK"));System.out.println("GBK編碼,GB18030解碼:"?+?new?String(bytes,?"GB18030"));System.out.println("GBK編碼,UTF-8解碼:"?+?new?String(bytes,?"UTF-8")); }

輸出結果:

GBK編碼,GBK解碼:漫話編程! GBK編碼,GB18030解碼:漫話編程! GBK編碼,UTF-8解碼:????????

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

錕斤拷的前世今生

因為Unicode是一直在更新的,在這個過程中,肯定有一些比較新的字符他是無法表示的。或者即使Unicode發(fā)布了新版納入了某個文字,但是很多軟件系統(tǒng)并未升級也會有這樣的問題。

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

發(fā)生以上情況時,無法顯示的時候也需要有一個字符來表示的,在Unicode中,這個字符就是 � ,他也是Unicode中定義的一個特殊字符。也就是"0xFFFD REPLACEMENT CHARACTER",所有無法表示的字符都會通過這個字符來表示。

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

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

0xEF?0xBF?0xBD? 0xEF?0xBF?0xBD

以上這段編碼,如果放到GBK中進行解碼的話,因為GBK中一個漢字兩個字節(jié),那么結果就是:

0xEF?0xBF,?0xBD?0xEF,?0xBF?0xBD

0xEFBF 0xBDEF 0xBFBD

那么,如果展示出來,就是:錕(0xEFBF),斤(0xBDEF),拷(0xBFBD),所以,以后再見到錕斤拷,第一時間想到UTF-8和GBK的轉換問題準沒錯。

除了錕斤拷以外,還有兩組比較經(jīng)典的亂碼,分別是"燙燙燙"和"屯屯屯",這兩個亂碼產(chǎn)生自VC,這是debug模式下VC對內(nèi)存的初始化操作。VC會把棧中新分配的內(nèi)存初始化為0xcc,而把堆中新分配的內(nèi)存初始化為0xcd。把0xcc和0xcd按照字符打印出來,就是燙和屯了。

快薅,當當?shù)难蛎?#xff0c;晚了就沒了!

快薅,當當?shù)难蛎?#xff0c;晚了就沒了!

快薅,當當?shù)难蛎?#xff0c;晚了就沒了!

- MORE | 更多精彩文章 -

  • 華為發(fā)布會: ?牛逼鴻蒙,吹水的大會

  • 我被失聯(lián)2年后,終于從東南亞的技術“魔窟”逃出來了...

  • 同步容器(如Vector)的所有操作一定是線程安全的嗎?

  • Spring Boot 2.X整合Spring-cache,讓你的網(wǎng)站速度飛起來

如果你喜歡本文,

請長按二維碼,關注?Hollis.

轉發(fā)至朋友圈,是對我最大的支持。

好文章,我在看??

總結

以上是生活随笔為你收集整理的看程序员如何给女朋友解释什么是锟斤拷?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。