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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

引子

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


ASCII

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

ASCII碼由一張主表和一張擴展表組成,如下圖,圖源網絡。

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

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


中文字符編碼

GB2312/GB2312-80

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

經過對本來ASCII里就有的數字、標點、字母進行兩個字節場的重新編碼,就形成了常說的"全角"字符,而原來小于127號的那些就叫"半角字符"。

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

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

GBK

GB2312支持的漢字太少。1995年的漢字擴展規范GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。其中漢字區包括21003個字符。

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

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

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


UNICODE

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

Unicode其實更像是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。

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

UTF-16

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

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

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

UTF-32

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

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

UTF-8

UTF-8是一種非常靈活的編碼方式,其根據字符在Unicode編碼中的位置來決定其由幾個字節組成。對應關系如下表:

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

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

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

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

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

BOM

BOM(Byte Order Mark),字節順序標記,出現在文本文件頭部,Unicode編碼標準中用于標識文件是采用哪種格式的編碼。

以UTF-16和UTF-8為例:

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

大端存儲和小端存儲

?概念

大端存儲與小端存儲模式主要指的是數據在計算機中存儲的兩種字節優先順序。

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

例如要表示0x12345678

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

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


工具推薦

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


總結

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

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。