本文主要介紹,下面一起看看相關資訊。
我們在處理文件或者程序字符的時候,時不時會遇到,而這些是非常容易混淆的。很多時候cv都會去查一下,看看有沒有類似情況的博文。如果有,就用博文的一步步解決。如果找不到他們,很多人會直接去找emo。實際上,聽起來很復雜,但解決起來并不十分困難。今天,讓我們 讓我們談談如何解決編碼和的問題。
什么是編碼?編碼是將信息從一種形式或格式轉換成另一種形式或格式的過程,也稱為計算機編程語言的代碼縮寫編碼。用預定的方法將字符、數(shù)字或其它物體編碼成數(shù)字,或將信息和數(shù)據(jù)轉換成規(guī)定的電脈沖信號。編碼廣泛應用于計算機、電視、遙控和通訊等領域。編碼是將信息從一種形式或格式轉換成另一種形式或格式的過程。解碼是編碼的逆過程。
編碼分類在日常發(fā)展中,有許多編碼格式,如gbk、utf8、ascii等。許多人不知道。;不知道這些編碼格式的區(qū)別,只知道編碼和解碼格式是一樣的,就不會有的問題。其實計算機軟件領域的編碼分為兩類,一類是unicode編碼,一類是非unicode編碼。
常見的非unicode編碼包括ascii、gbk、gb18030、iso88591、windows1252等。
我們都知道這個世界 美國誕生了第一臺電腦。當時,作者沒有 t想不了那么多,只考慮了美國的需要(美國大概用的是128個字符),于是他規(guī)定了當時128個字符的二進制表示方法,也就是一套標準,即ascii,翻譯成美國的信息交換標準碼。
計算機存儲的最小單位是字節(jié),即8位,7位可以表示128個字符。在ascii中,最高位設置為0,其他7位可以用0~127來表示,其中0~127的每一個數(shù)字的含義都用ascii編碼來規(guī)定,基本可以涵蓋鍵盤上的所有字符。
需要注意的是,ascii中有一些特殊的不可打印字符,常用的不可打印字符有
美國用ascii碼就夠了,但是世界上那么多國家,字符和語言都不一樣。因此,各個國家的各種計算機制造商發(fā)明了各種編碼方法來表示自己國家的字符。為了保持與ascii碼的兼容性,最高位一般設置為1。也就是說,最高位為0時代表標準的ascii碼,為1時是各個國家的擴展。開發(fā)你自己的字符編碼。在這些擴展碼中,西歐國家流行iso 88591和windows1252,流行gb2312、gbk和gb18030。這些代碼的區(qū)別就一一介紹了。
iso 88591和windows1252iso 88591,也稱為latin1,用一個字節(jié)表示一個字符,其中0~127與ascii相同,128~255有不同的含義。在128~255中,128~159代表一些控制字符,160~255代表一些西歐字符。這些字在國內不常用,我就不一一介紹了。
盡管iso 88591聲稱自己是西歐國家的統(tǒng)一標準,但它并不。;甚至沒有歐元符號(),因為歐元符號出現(xiàn)得晚,而iso 88591標準出現(xiàn)得早。因此,windows1252編碼在實踐中應用更廣泛,與iso 88591基本相同,區(qū)別僅在于128~159這幾個干數(shù)。html5甚至明確規(guī)定,如果一個文件聲明了iso 88591編碼,就應該被視為windows1252編碼。為什么會這樣?因為大多數(shù)人不知道。;我不知道iso 88591和windows1252的區(qū)別,當他說iso 88591時,他實際上指的是windows1252,所以這個標準只是強制性的。windows1252使用這些數(shù)字中的一部分來表示可打印字符。
相信國內開發(fā)者對gb2312、gbk、gb18030這三種編碼格式都比較熟悉。這三種編碼格式也是漢字顯示的編碼格式。這三種業(yè)態(tài)有什么區(qū)別和聯(lián)系?
gb2312美國和西歐字符一個字節(jié)就夠了,中文顯然不夠。第一個標準是gb2312。gb2312標準主要針對簡體中文中的常用字,包括約7000個漢字和一些生僻字、繁體字。
gb2312總是用兩個字節(jié)來表示漢字。在這兩個字中,最高位是1,如果是0,則認為是ascii字符。在這兩個字節(jié)中,高位字節(jié)范圍為0xa1~0xf7,低位字節(jié)范圍為0xa1~0xfe。
gbkgbk基于gb2312。向后兼容gb2312,也就是說gb2312編碼的字符和二進制表示在gbk編碼中是完全一樣的。gbk新增了14000多個漢字,包括繁體字在內共約21000個漢字。
gbk用固定在同一個體中的兩個字節(jié)表示,其中上字節(jié)范圍為0x81~0xfe,下字節(jié)范圍為0x40~0x7f和ox80~0xfe。
需要注意這意味著低階字節(jié)從ox40(即64)開始,也就是說,低階字節(jié)的最高位可能是0。那怎么知道是漢字的一部分還是ascii字符呢?其實很簡單,因為漢字是用兩個固定的字節(jié)表示的。在解析二進制流時,如果第一個字節(jié)的最高位是1,那么下一個字節(jié)將被讀入并解析為一個漢字,而不考慮它的最高位。解析后,跳到第三個字節(jié)繼續(xù)解析。
gb18030gb18030向后兼容gbk,增加了55000多個字符,共計76000多個字符,包括了很多少數(shù)民族字符和中日韓統(tǒng)一字符。
兩個字節(jié)可以 不能代表gb18030中的所有字符。gb18030采用變長編碼,有的字符是兩個字節(jié),有的是四個字節(jié)。在雙字節(jié)編碼中,字節(jié)表示范圍與gbk相同。在四字節(jié)編碼中,第一個字節(jié)的值是0x81~0xfe,第二個字節(jié)的值是0x30~0x39,第三個字節(jié)的值是0x81~0xfe,第四個字節(jié)的值是0x30~0x39。
解析二進制時,如何知道兩個字節(jié)還是四個字節(jié)代表一個字符?看第二個字節(jié)的范圍。如果是0x30~0x39,表示4個字節(jié),因為兩個字節(jié)碼中的第二個字節(jié)比這個大。
unicode編碼如果上面的編碼可以表示中文、英文等所需要的字符,那么世界上就有各種民族語言,每個國家都實現(xiàn)了一套基于ascii的編碼標準,那么就會有成千上萬套編碼。那么世界上沒有統(tǒng)一的標準嗎?沒錯,這就是unicode編碼!
unicode做了一件事,就是給世界上所有的字符分配了一個唯一的數(shù)字,范圍從0x000000~0x10eeef,包括110多萬。但大多數(shù)常用字符都在0x0000~0xeeef之間,即65536個數(shù)字以內。每個字符都有一個unicode數(shù)字,通常用十六進制表示,前面有一個u。大多數(shù)數(shù)字的范圍是從u4e00到u9fff。
簡單來說,unicode主要做一件事,就是給所有字符分配唯一的數(shù)值。它不 t指定這個數(shù)字如何對應于二進制表示,這與上面介紹的其他編碼不同。其他編碼不僅指定可以表示哪些字符,還指定每個字符對應的二進制是什么,而unicode本身只指定每個字符的編號。目前常用的編碼方案有utf8、utf16和utf32。
utf8utf8由可變長度的字節(jié)表示,每個字符中使用的字節(jié)數(shù)與其unicode編碼的大小有關。較小的數(shù)字使用較少的字節(jié),而較大的數(shù)字使用它們。有很多字節(jié),使用的字節(jié)數(shù)從1到4不等。小于128,編碼同ascii碼,最高位為0。其他數(shù)字的第一個字節(jié)有特殊的含義。最高位中幾個連續(xù)的1表示幾個字節(jié),而所有其他字節(jié)都以10開始。
如何對unicod:。
1)對于編號從u0000到uffff(常用字符集)的字符,直接用兩個字節(jié)表示。需要注意的是,u d800~u dbff的編號實際上是未定義的。
2)字符值在u10000和u10ffff之間的字符(也叫補充字符集)需要用4個字節(jié)表示。前兩個字節(jié)稱為高代理項,范圍從ud800到udbff最后兩個字節(jié)稱為低代理,范圍是u dc00~u dfff。數(shù)字數(shù)和這個二進制表示之間有一個轉換算法,這里就不詳細介紹了。
區(qū)分兩個字節(jié)還是四個字節(jié)代表一個字符取決于前兩個字節(jié)的數(shù)字范圍。如果是u d800~u dbff,就是四個字節(jié),否則就是兩個字節(jié)。
utf32最簡單,是字符數(shù)的整數(shù)二進制形式,4個字節(jié)。
但是有一個細節(jié),就是字節(jié)的順序。如果第一個字節(jié)是整數(shù)二進制中的最高位,最后一個字節(jié)是整數(shù)二進制中的最低位,那么這個字節(jié)序列稱為 大端字節(jié)序 ,否則就叫 小端。樂 。相應的編碼方法分別是utf32be和utf32le。
可以看出,每個字符用4個字節(jié)表示,很浪費空間,實際用得更少。
unicode編碼摘要unicode為世界上所有字符提供了一個統(tǒng)一的編號,編號范圍超過110萬,但大多數(shù)字符都在65536以內。unicode本身并沒有規(guī)定如何將這個數(shù)字映射成二進制形式。
ute32/ute16/ute8都在做一件事,就是把unicode數(shù)字對應到二進制形式,只是對應的方法不同。utf32用4字節(jié),utf多用2字節(jié),少數(shù)用4字節(jié)。它們與ascii編碼不兼容,并且都有字節(jié)順序問題。utf8用1~4字節(jié)表示,兼容ascii編碼,1字節(jié)為英文字符,3字節(jié)為中文字符。
編碼轉換用統(tǒng)一的unicode編碼,也可以適應不同類型的編碼格式,如中文單詞 xi :
編碼系統(tǒng)
十六進制的
編碼系統(tǒng)
十六進制的
gbk
cef7
utf8
%u897f
統(tǒng)
\u897f
utf16
897f
不同的編碼格式如何通過unicode編碼兼容?那么就必須通過編碼來轉換。我們可以認為每種編碼都有一個映射表來存儲其唯一的字符編碼和unicod:的一個字符從a編碼變成b編碼。首先找到字符的a編碼格式,通過a的映射表找到它的unicode編碼,然后通過unicode編碼搜索b的映射表找到字符的b編碼格式。通過這種轉換,可以實現(xiàn)不同編碼格式的兼容。
例如,當 xi 從gbk換到utf8,先查gb18030unicode的號碼表得到它的號碼為\u897f,再查uncod:% u897f。
上面介紹了的根源?,F(xiàn)在讓我們 讓我們看看。一般有兩個原因:一個是簡單的錯誤分析,一個是比較復雜的。在誤差分析的基礎上,還進行了編碼轉換。
錯誤分析一個英國人寫了一個windows1252編碼格式的文件,發(fā)給一個人。然后解碼打開了。他看到的最后一份文件是。
在這種情況下,它似乎是,因為數(shù)據(jù)是以錯誤的查看或解釋的。只要用正確的編碼方法去解讀,是可以糾正的。很多文件編輯器,比如:。
例如,單詞 xi 是gbk,編碼(十六進制)是cef7。
這種二進制形式被誤認為是windows1252編碼被引入并解釋為字符 小 。
隨后,這個字符被編碼轉換成utf8編碼,形式仍然是\u,但是二進制變成了1111111111111111111111111111111111111111111111111111111111111111111111111111111111
這時,根據(jù)gbk的分析,字符變得。小 ,而此時無論如何切換查看代碼的,這個二進制看起來都是。
這種情況是產生的主要原因。
這種情況其實很常見。為了便于統(tǒng)一處理,計算機程序往往將所有代碼轉換成一種,如utf8。轉換的時候需要知道原代碼是什么,但是可能會出錯。一旦你做錯了轉換,就會出現(xiàn)這種。在這種情況下,無論如何切換觀看編碼模式,都是不可接受的。
對的解決方法,如果是簡單的方法,可以先用編輯器試著解析一遍,看看能不能解析回正確的代碼;但是,如果稍微復雜一點,比如上面提到的錯誤分析和轉換,編輯器可以 t找不到正確的方法,建議用程序解決;這里,我們使用了被錯誤解析為 小 。讓 讓我們找到它的正確編碼:
首先,讓我們 讓我們寫一個方法。首先,將所有編碼格式放入一個數(shù)組(i ll這里簡單列舉幾個),然后用一個循環(huán)來解析它們,然后從輸出結果中找出符合原始編碼的字符和對應的編碼。
這里 程序是:
最終運行結果是:
最終我們得到的結果是,字符的原始編碼是gbk,被錯誤解析為windows1252,于是我們找到了字符的原始編碼。
根據(jù)這個程序,可以逆向找到原代碼,因為我們實際應用的編碼格式是有限的,所以這種暴力的逆向搜索還是很有用的,也很快。
當然,能找到的對應原碼都是簡單的,不是很復雜的文件。如果對文件進行多次錯誤解析和格式轉換,反破解原代碼的難度與破解不固定的安全密碼無異。
通過本文,我們可以清楚地了解計算機軟件編碼的分類,分為非unicode編碼和unicode編碼。非unicode編碼主要基于ascii系統(tǒng),而utf8是應用最廣泛的unicode編碼方案,這些不同的編碼類型可以通過一定的規(guī)則相互轉換。
編碼和解碼不使用同一套編碼格式,會導致。所以在產生的時候,我們可以用一些編輯器或者瀏覽器改變編碼找到原來的格式,可以用程序工具進行暴力匹配。這種方法也更直接有效。
了解更多相關內容請關注本站點。