最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C#編程總結(jié) 字符編碼

2021-09-18 01:37 作者:電子DIY工作坊  | 我要投稿

https://www.cnblogs.com/yank/p/3529395.html

相信大家一定遇到過(guò)亂碼的問(wèn)題,為什么會(huì)亂碼呢?輸出的數(shù)據(jù)怎么就跟輸入的不一樣呢?

最近在總結(jié)加密問(wèn)題,也遇到了同樣的困擾。所以今天來(lái)集中解決這個(gè)問(wèn)題。

什么是字符?

字符是指計(jì)算機(jī)中使用的字母、數(shù)字、字和符號(hào),包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。

字符集(Charset)

字符集(Charset)是一個(gè)系統(tǒng)支持的所有抽象字符的集合。

字符是各種文字和符號(hào)的總稱,包括各國(guó)家文字、標(biāo)點(diǎn)符號(hào)、圖形符號(hào)、數(shù)字等。

什么是字符編碼?

字符編碼(Character Encoding):簡(jiǎn)單的說(shuō)就是建立自然語(yǔ)言與機(jī)器語(yǔ)言之間的對(duì)應(yīng)關(guān)系。是一套法則,使用該法則能夠?qū)ψ匀徽Z(yǔ)言的字符的一個(gè)集合(如字母表或音節(jié)表),與其他東西的一個(gè)集合(如號(hào)碼或電脈沖)進(jìn)行配對(duì)。即在符號(hào)集合與數(shù)字系統(tǒng)之間建立對(duì)應(yīng)關(guān)系,它是信息處理的一項(xiàng)*本技術(shù)。通常人們用符號(hào)集合(一般情況下就是文字)來(lái)表達(dá)信息。而以計(jì)算機(jī)為*礎(chǔ)的信息處理系統(tǒng)則是利用元件(硬件)不同狀態(tài)的組合來(lái)存儲(chǔ)和處理信息的。元件不同狀態(tài)的組合能代表數(shù)字系統(tǒng)的數(shù)字,因此字符編碼就是將符號(hào)轉(zhuǎn)換為計(jì)算機(jī)可以接受的數(shù)字系統(tǒng)的數(shù),稱為數(shù)字代碼。?

計(jì)算機(jī)中的信息包括數(shù)據(jù)信息和控制信息,數(shù)據(jù)信息又可分為數(shù)值和非數(shù)值信息。非數(shù)值信息和控制信息包括了字母、各種控制符號(hào)、圖形符號(hào)等,它們都以二進(jìn)制編碼方式存入計(jì)算機(jī)并得以處理,這種對(duì)字母和符號(hào)進(jìn)行編碼的二進(jìn)制代碼稱為字符代碼(Character Code)。計(jì)算機(jī)中常用的字符編碼有ASCII碼(美國(guó)標(biāo)準(zhǔn)信息交換碼)和EBCDIC碼(擴(kuò)展的BCD交換碼)。

在 ASCII 編碼中,一個(gè)英文字母字符存儲(chǔ)需要1個(gè)字節(jié)。在 GB 2312 編碼或 GBK 編碼中,一個(gè)漢字字符存儲(chǔ)需要2個(gè)字節(jié)。在UTF-8編碼中,一個(gè)英文字母字符存儲(chǔ)需要1個(gè)字節(jié),一個(gè)漢字字符儲(chǔ)存需要3到4個(gè)字節(jié)。在UTF-16編碼中,一個(gè)英文字母字符或一個(gè)漢字字符存儲(chǔ)都需要2個(gè)字節(jié)(Unicode擴(kuò)展區(qū)的一些漢字存儲(chǔ)需要4個(gè)字節(jié))。在UTF-32編碼中,世界上任何字符的存儲(chǔ)都需要4個(gè)字節(jié)。?

困擾與疑惑?

1、為什么會(huì)有字符編碼?

含義介紹中已經(jīng)給出了解釋,字符編碼就是讓計(jì)算機(jī)識(shí)別自然語(yǔ)言。

2、為什么會(huì)有這么多的字符集?

計(jì)算機(jī)發(fā)展分不同階段,最開(kāi)始只是美國(guó)通用,建立了ASCII碼,但是一些歐洲國(guó)家字符無(wú)法使用ASCII碼,然后就對(duì)ASCII進(jìn)行了擴(kuò)展補(bǔ)充,后來(lái)中國(guó)要使用計(jì)算機(jī),為了標(biāo)記漢語(yǔ),定義了GB2312、GBK、BIG5等,還有其他一些字符集。

3、就沒(méi)有一種統(tǒng)一的字符集嗎?

有,Unicode

4、UTF8與Unicode是什么關(guān)系?

UTF8是Unicode的一種實(shí)現(xiàn)方式。?

常用的幾種編碼

1. ASCII碼

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

ASCII字符集:主要包括控制字符(回車(chē)鍵、退格、換行鍵等);可顯示字符(英文大小寫(xiě)字符、阿拉伯?dāng)?shù)字和西文符號(hào))。

特點(diǎn):?jiǎn)巫止?jié)編碼,只包含大小寫(xiě)英文字母、標(biāo)點(diǎn)符號(hào)及其他符號(hào)。

ASCII編碼:將ASCII字符集轉(zhuǎn)換為計(jì)算機(jī)可以接受的數(shù)字系統(tǒng)的數(shù)的規(guī)則。使用7位(bits)表示一個(gè)字符,共128字符;但是7位編碼的字符集只能支持128個(gè)字符,為了表示更多的歐洲常用字符對(duì)ASCII進(jìn)行了擴(kuò)展,ASCII擴(kuò)展字符集使用8位(bits)表示一個(gè)字符,共256字符。

計(jì)算機(jī)為美國(guó)人發(fā)明,開(kāi)始的時(shí)候也只能滿足自己,所以說(shuō)此編碼很有局限性。在其他的國(guó)家、其他語(yǔ)種無(wú)法使用此編碼集。

根據(jù)ASCII碼的編碼規(guī)則,最多只能標(biāo)識(shí)256個(gè)字符,但是世界上有那么多語(yǔ)言,漢字就多達(dá)10萬(wàn)左右,那么多字符,顯然很有局限性。

以下是ASCII代碼表,表二為其擴(kuò)展表。


2、中文編碼

2.1 GB2312

特點(diǎn):簡(jiǎn)體中文字符集,采用雙字節(jié)編碼。

GB2312或GB2312-80是中國(guó)國(guó)家標(biāo)準(zhǔn)簡(jiǎn)體中文字符集,全稱《信息交換用漢字編碼字符集·*本集》,又稱GB0,由中國(guó)國(guó)家標(biāo)準(zhǔn)總局發(fā)布,1981年5月1日實(shí)施。GB2312編碼通行于中國(guó)大陸;新加坡等地也采用此編碼。中國(guó)大陸幾乎所有的中文系統(tǒng)和國(guó)際化的軟件都支持GB2312。GB2312的出現(xiàn),*本滿足了漢字的計(jì)算機(jī)處理需要,它所收錄的漢字已經(jīng)覆蓋中國(guó)大陸99.75%的使用頻率。對(duì)于人名、古漢語(yǔ)等方面出現(xiàn)的罕用字,GB2312不能處理,這導(dǎo)致了后來(lái)GBK及GB 18030漢字字符集的出現(xiàn)。?

2.2 GBK

特點(diǎn):擴(kuò)展了GB2312,包括非常用簡(jiǎn)體漢字、繁體字、日語(yǔ)及朝鮮漢字等。

由于GB 2312只收錄6763個(gè)漢字,有不少漢字,如部分在GB 2312-80推出以后才簡(jiǎn)化的漢字(如"啰"),部分人名用字(如中國(guó)前總理***的"*"字),臺(tái)灣及香港使用的繁體字,日語(yǔ)及朝鮮語(yǔ)漢字等,并未有收錄在內(nèi)。于是廠商微軟利用GB 2312-80未使用的編碼空間,收錄GB 13000.1-93全部字符制定了GBK編碼。?

2.3 BIG編碼

特點(diǎn):繁體中文,流行于臺(tái)灣、香港與澳門(mén),采用雙字節(jié)編碼。

Big5,又稱為大五碼或五大碼,是使用繁體中文(正體中文)社區(qū)中最常用的電腦漢字字符集標(biāo)準(zhǔn),共收錄13,060個(gè)漢字。中文碼分為內(nèi)碼及交換碼兩類,Big5屬中文內(nèi)碼,知名的中文交換碼有CCCII、CNS11643。Big5雖普及于臺(tái)灣、香港與澳門(mén)等繁體中文通行區(qū),但長(zhǎng)期以來(lái)并非當(dāng)?shù)氐膰?guó)家標(biāo)準(zhǔn),而只是業(yè)界標(biāo)準(zhǔn)。Big5碼是一套雙字節(jié)字符集,使用了雙八碼存儲(chǔ)方法,以兩個(gè)字節(jié)來(lái)安放一個(gè)字。第一個(gè)字節(jié)稱為"高位字節(jié)",第二個(gè)字節(jié)稱為"低位字節(jié)"。"高位字節(jié)"使用了0x81-0xFE,"低位字節(jié)"使用了0x40-0x7E,及0xA1-0xFE。?

2.4 GB18030

GB 18030,全稱:國(guó)家標(biāo)準(zhǔn)GB 18030-2005《信息技術(shù) 中文編碼字符集》,是中華人民共和國(guó)現(xiàn)時(shí)最新的內(nèi)碼字集,是GB 18030-2000《信息技術(shù) 信息交換用漢字編碼字符集 *本集的擴(kuò)充》的修訂版。與GB 2312-1980完全兼容,與GBK*本兼容,支持GB 13000及Unicode的全部統(tǒng)一漢字,共收錄漢字70244個(gè)。

3.Unicode

特點(diǎn):涵蓋所有的文字、符號(hào),每個(gè)符號(hào)都有獨(dú)一無(wú)二的編碼,全世界通用,四字節(jié)存儲(chǔ)。

Unicode(統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼)是一種在計(jì)算機(jī)上使用的字符編碼。Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的,它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。1990年開(kāi)始研發(fā),1994年正式公布。隨著計(jì)算機(jī)工作能力的增強(qiáng),Unicode也在面世以來(lái)的十多年里得到普及。

具體的符號(hào)對(duì)應(yīng)表,可以查詢unicode.org,或者專門(mén)的漢字對(duì)應(yīng)表。

全部編碼采用4字節(jié)存儲(chǔ),如果是ASCII碼,本來(lái)是單字節(jié)存儲(chǔ)的,也要用四字節(jié)來(lái)存儲(chǔ),前三個(gè)字節(jié)都是0,很浪費(fèi)空間。

4.UTF-8

特點(diǎn):Unicode的一種實(shí)現(xiàn)方式,變長(zhǎng)的編碼方式,可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。

互聯(lián)網(wǎng)的普及,強(qiáng)烈要求出現(xiàn)一種統(tǒng)一的編碼方式。UTF-8就是在互聯(lián)網(wǎng)上使用最廣的一種Unicode的實(shí)現(xiàn)方式。其他實(shí)現(xiàn)方式還包括UTF-16(字符用兩個(gè)字節(jié)或四個(gè)字節(jié)表示)和UTF-32(字符用四個(gè)字節(jié)表示),不過(guò)在互聯(lián)網(wǎng)上*本不用。

UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。

UTF-8的編碼規(guī)則很簡(jiǎn)單,只有二條:

1)對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的unicode碼。因此對(duì)于英語(yǔ)字母,UTF-8編碼和ASCII碼是相同的。

2)對(duì)于n字節(jié)的符號(hào)(n>1),第一個(gè)字節(jié)的前n位都設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒(méi)有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的unicode碼。

下表總結(jié)了編碼規(guī)則,字母x表示可用編碼的位。

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

跟據(jù)上表,解讀UTF-8編碼非常簡(jiǎn)單。如果一個(gè)字節(jié)的第一位是0,則這個(gè)字節(jié)單獨(dú)就是一個(gè)字符;如果第一位是1,則連續(xù)有多少個(gè)1,就表示當(dāng)前字符占用多少個(gè)字節(jié)。

下面,還是以漢字"嚴(yán)"為例,演示如何實(shí)現(xiàn)UTF-8編碼。

已知"嚴(yán)"的unicode是4E25(100111000100101),根據(jù)上表,可以發(fā)現(xiàn)4E25處在第三行的范圍內(nèi)(0000 0800-0000 FFFF),因此"嚴(yán)"的UTF-8編碼需要三個(gè)字節(jié),即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,從"嚴(yán)"的最后一個(gè)二進(jìn)制位開(kāi)始,依次從后向前填入格式中的x,多出的位補(bǔ)0。這樣就得到了,"嚴(yán)"的UTF-8編碼是"11100100 10111000 10100101",轉(zhuǎn)換成十六進(jìn)制就是E4B8A5。?

為什么會(huì)出現(xiàn)亂碼?

由于字符編碼不同,一種編碼無(wú)法兼容另一種編碼,就會(huì)出現(xiàn)亂碼。

舉個(gè)簡(jiǎn)單例子,ASCII編碼轉(zhuǎn)為UTF8是沒(méi)問(wèn)題的,但是當(dāng)UTF8轉(zhuǎn)ASCII碼就可能出問(wèn)題。

舉個(gè)簡(jiǎn)單例子:

你如果是一個(gè)會(huì)英語(yǔ)的中國(guó)人,當(dāng)一個(gè)英國(guó)人給你說(shuō)話時(shí),你明白他的意思,但回答的是中文,他估計(jì)不會(huì)聽(tīng)懂的。


C#編程總結(jié) 字符編碼的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
乌鲁木齐县| 扶余县| 兰西县| 建阳市| 高台县| 乌拉特中旗| 平昌县| 五河县| 罗江县| 温州市| 永胜县| 丹巴县| 视频| 华容县| 海阳市| 阿鲁科尔沁旗| 西和县| 巴彦淖尔市| 牟定县| 临颍县| 武义县| 汉沽区| 车致| 娄烦县| 海林市| 图木舒克市| 专栏| 马鞍山市| 常州市| 乌鲁木齐市| 柳江县| 黑山县| 泽州县| 子洲县| 芦山县| 泊头市| 福建省| 峡江县| 林周县| 苏州市| 门源|