日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

纯文本文件的字符编码未声明_浅谈几种常见的字符编码

發(fā)布時間:2025/3/20 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 纯文本文件的字符编码未声明_浅谈几种常见的字符编码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引子

相信大家平時工作和生活中,都遇到過亂碼的現(xiàn)象。比如PDF格式的文件復(fù)制粘貼到Word文件中,很容易出現(xiàn)錯誤,影響對文件的識別。那么這種現(xiàn)象是如何產(chǎn)生的呢?下面就帶大家一探究竟。


ASCII

最早廣泛使用,名氣最大的編碼方式當(dāng)屬ASCII(美國標(biāo)準(zhǔn)信息交換碼)。眾所周知,計算機(jī)內(nèi)部的所有信息最終都是一個二進(jìn)制值。每一個二進(jìn)制位(bit)有0和1兩種狀態(tài),因此八個二進(jìn)制位就可以組合出256種狀態(tài),這也被稱為一個字節(jié)(byte)。也就是說,一個字節(jié)可以表示256種不同的狀態(tài),每一個狀態(tài)對應(yīng)一個符號,就是256個符號。

ASCII碼由一張主表和一張擴(kuò)展表組成,如下圖,圖源網(wǎng)絡(luò)。

使用WinHEX以16進(jìn)制打開內(nèi)容為“AB”的ASCII編碼方式的文本文件,可以看到其值為0x41、0x42對應(yīng)十進(jìn)制的65、66,符合上表內(nèi)容。

ASCII碼表對于以英語為母語的國家來說,足夠用了。但對于其他國家來說,明顯是不能滿足需求的。所以,在計算機(jī)傳入中國以后,中國專家制定了GB2312/GB2312-80編碼。


中文字符編碼

GB2312/GB2312-80

由于擴(kuò)展ASCII碼表不常用,中國專家整合了擴(kuò)展ASCII碼表(即128-255)并進(jìn)行了重新編碼,規(guī)定:一共小于127的字符的意義與原來相同,但當(dāng)兩個大于127的字符連在一起時,就表示一個漢字,這樣我們就可以組合出大約7000個簡體漢字。上述編碼規(guī)則就是GB2312或GB2312-80(國標(biāo)碼)。

經(jīng)過對本來ASCII里就有的數(shù)字、標(biāo)點、字母進(jìn)行兩個字節(jié)場的重新編碼,就形成了常說的"全角"字符,而原來小于127號的那些就叫"半角字符"。

使用WinHEX以16進(jìn)制打開內(nèi)容為“AB中國”的GB2312編碼方式的文件,可以清楚的看到A、B仍然存儲為0x41、0x42;“中”和“國”均由2個處于0x80-0xFF的十六進(jìn)制數(shù)(對應(yīng)十進(jìn)制的128-255)表示。

GB2312/GB2312-80包含了大部分常用漢字。然而在生產(chǎn)生活中,我們時不時的會使用到一些生僻字,在此基礎(chǔ)上就誕生了GBK編碼。

GBK

GB2312支持的漢字太少。1995年的漢字?jǐn)U展規(guī)范GBK1.0收錄了21886個符號,它分為漢字區(qū)和圖形符號區(qū)。其中漢字區(qū)包括21003個字符。

從ASCII、GB2312到GBK,這些編碼方法是向下兼容的,即同一個字符在這些方案中總是有相同的編碼,后面的標(biāo)準(zhǔn)支持更多的字符。在這些編碼中,英文和中文可以統(tǒng)一處理。字符不論中英文均使用雙字節(jié)來表示,只不過為了區(qū)分中文,才將其最高位都定成1。

由于GBK與GB2312和SCII編碼兼容,所以在常用字符上,二者編碼一致,為避免重復(fù),此處不在圖上詳細(xì)講解。

GBK編碼很好地滿足了我們國家民眾的需求,但這種方式也有其弊端。如跨國交流的時候,像中國和日本、韓國等使用象形文字的國家之間,傳送文件后仍會出現(xiàn)亂碼現(xiàn)象。在此種情況下,Unicode應(yīng)運而生。


UNICODE

Unicode是一個編碼方案,說白了就是一張包含全世界所有文字的一個編碼表,只要這個世界上存在的文字符號,統(tǒng)統(tǒng)給你一個唯一的編碼。Unicode編碼范圍是: 0-0x10FFFF,可以容納100多萬個符號。

Unicode其實更像是一個符號集,它只規(guī)定了符號的二進(jìn)制代碼,卻沒有規(guī)定這個二進(jìn)制代碼應(yīng)該如何存儲。

Unicode 編碼共有三種具體實現(xiàn),分別為UTF-8,UTF-16,UTF-32。我們平時所說的Unicode 編碼默認(rèn)是指UTF-16編碼。

UTF-16

UTF-16編碼以16位無符號整數(shù)為單位,注意是16位為一個單位,不能一股腦地認(rèn)為UTF-16編碼就是16位;這個要看字符的unicode編碼處于什么范圍而定,有可能是2個字節(jié),也可能是4個字節(jié)。

同樣以內(nèi)容為“AB中國”的文本文件為例,最前面的“FF FE”被稱為BOM,這個下文會提到,先不談。可以看到即便是A、B這種原本只用一個字節(jié)能表示的字符,也仍舊占據(jù)了兩個字節(jié)。

在本地還好,只是浪費點磁盤空間,但是在網(wǎng)絡(luò)傳輸時,十分占用資源,尤其對英語母語的國家而言。

UTF-32

UTF-32是對Unicode編碼的最簡單粗暴的實現(xiàn)方式,即每個字符均有4個字節(jié)表示。UTF-16尚且算浪費資源,更何況UTF-32呢?由于其過于浪費資源,使用范圍很窄,本文在這里就不詳談了。

那么有沒有一種比較省資源的編碼方式呢?答案是有,即UTF-8編碼。

UTF-8

UTF-8是一種非常靈活的編碼方式,其根據(jù)字符在Unicode編碼中的位置來決定其由幾個字節(jié)組成。對應(yīng)關(guān)系如下表:

Unicode編碼(16進(jìn)制)UTF-8字節(jié)流(二進(jìn)制)
000000 - 00007F0xxxxxxx
000080 - 0007FF110xxxxx 10xxxxxx
000800 - 00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

同樣以內(nèi)容為“AB中國”的文本文件為例,最前面的“EF BB BF”被稱為BOM,先忽略。字符A、B處在000000 - 00007F范圍內(nèi),所以仍為0x41、0x42,很容易理解。難點在"中"和"國“的編碼。

以”中“為例,“中”的Unicode編碼為4E 2D,處于000800 - 00FFFF范圍內(nèi)。將4E 2D化為二進(jìn)制“0100 ?1110 ?0010 ? 1101”,按照上表中第三行右側(cè)的情況分組,然后在最前面填充“1110”、“10”、”10“,最后在重新轉(zhuǎn)成16進(jìn)制即可。“國”同理,由興趣的讀者可以嘗試推導(dǎo)下。

4 E 2 D 0100 1110 0010 1101 0100 111000 10110111100100 10111000 10101101 E4 B8 AD

因為UTF-8編碼方式靈活,所以相應(yīng)的其解碼所需的時間也比UTF-16和UTF-32要長。

BOM

BOM(Byte Order Mark),字節(jié)順序標(biāo)記,出現(xiàn)在文本文件頭部,Unicode編碼標(biāo)準(zhǔn)中用于標(biāo)識文件是采用哪種格式的編碼。

以UTF-16和UTF-8為例:

編碼格式文件起始標(biāo)識
UTF-8EF BB BF
UTF-16LE(小端存儲)FF FE
UTF-16BE(大端存儲)FE FF

大端存儲和小端存儲

?概念

大端存儲與小端存儲模式主要指的是數(shù)據(jù)在計算機(jī)中存儲的兩種字節(jié)優(yōu)先順序。

?小端存儲:高位字節(jié)放在高地址,低位字節(jié)存放在低地址。?大端存儲:高位字節(jié)放在低地址,低位字節(jié)存放在高地址。

例如要表示0x12345678

偏移地址: 0x 00 01 02 03小端存儲: 78 56 34 12大端存儲: 12 34 56 78

?各自優(yōu)點:?小端存儲:便于數(shù)據(jù)之間的類型轉(zhuǎn)換,例如:long類型轉(zhuǎn)換為int類型時,高地址部分的數(shù)據(jù)可以直接截掉。?大端存儲:便于數(shù)據(jù)類型的符號判斷,因為最低地址位數(shù)據(jù)即為符號位,可以直接判斷數(shù)據(jù)的正負(fù)號。?用途:?小端存儲:常見于本地主機(jī)上(也有部分類型主機(jī)為大端存儲)和x86平臺。?大端存儲:常見于網(wǎng)絡(luò)通信和arm/移動平臺上,網(wǎng)際協(xié)議TCP/IP在傳輸整型數(shù)據(jù)時一般使用大端存儲模式表示,例如TCP/IP中表示端口和IP時,均采用的是大端存儲


工具推薦

?WinHEX:http://www.x-ways.net/winhex/?UltraEdit:https://www.ultraedit.com/?CyberChef: https://github.com/gchq/CyberChef


總結(jié)

盡管編碼方式多種多樣,現(xiàn)實生活中仍需靈活選擇。若選擇國際通用,則選擇UTF-8編碼;若僅僅是國內(nèi)使用,則選擇GBK編碼(因為UTF-8中漢字占了3個字節(jié),反而浪費了空間)。其他編碼,可以自取所需。

此外,若遇到亂碼問題,可以使用Windows平臺內(nèi)置的記事本notepad.exe.打開文件后,點擊文件菜單中的“另存為命令”,點擊對話框最底部編碼的下拉條,保存即可。

總結(jié)

以上是生活随笔為你收集整理的纯文本文件的字符编码未声明_浅谈几种常见的字符编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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