判斷GBK編碼的字元是否為亂碼

來源:互聯網
上載者:User

 GBK為雙位元組編碼,但是他向下相容gb2312,也就是說英文標點符號、字母、數字都是用一個位元組標示。

我現在有這樣的需求:我需要讀取一個被加密的文字檔。

現在有兩個限制,第一我不能一次讀取整個文本,因為文本很大,手機不能承受。第二,因為這個檔案加密是對每個位元組做的處理,所以我必須先用位元組流讀取這個檔案並解密在轉換成字元。

我第一次用位元組流讀取一段內容時,最後一個位元組可能是一個中文字元的前半個位元組。如果不做任何處理就顯示出來,第一次是最後一個字是亂碼,然後繼續讀繼續顯示,後面就有大段亂碼。 一下個圖就是最好的說明

“一束驅魔光環落在了奇蹟古樹上,死亡纏繞被解除,然而”

我每次讀取固定的長度,一為例每次讀取16個位元組,第一次讀取沒問題,第二次讀取的時候,因為“,”只佔一個位元組,所以這次讀取的末尾位元組是“亡”字的高位元組,這半個位元組無法被正確編碼,所以被“?”代替,當我在讀第三次的時候,原本“B2 F8”的“纏”字,卻按“F6 B2”來編碼,這樣後面的內容就全亂了。

 

要解決這個問題,我就必須要判斷最後一個位元組是不是高位元組。因為如果末尾是低位元組和單位元組對我後面的操作都沒有影響。

在位元組流中判斷,我目前還沒找到方法,所以我在字元中判斷

我把每次讀取的一段位元組解密後,轉成字元new String(_data,"GBK").toCharArray();

然後在判斷最後一個字元是否為65533,因為如果用半個位元組去轉成GBK的字元是轉不了的,所以就會用65533來代替這個無法處理的字元。

判斷之後把這半個位元組儲存來下放到下次讀取的資料前,在一起轉成字元就可以了

 

===============================更新===========================================

上面這個方法只能在模擬器上實現,在真機上不可以,因為在真機上,如果在末尾有半個位元組,它會自動去掉,我用N73做個測試所以可以肯定,一下是我的解決辦法,這個方法在真機上測試沒有問題

 

我需要讀取一個檔案,但是不能一次載入,只能分段讀取,我已經解決了。
首先你需要知道GBK編碼範圍:首位元組:0x81~0xFE;尾位元組:0x40~0xFE
出現亂碼的原因就是截取的位置不對 導致一個尾位元組+高位元組組合成一個漢字
所以 我們需要判斷第一個位元組或者最後一個位元組是否是高位元組 就能解決這個問題
根據GBK編碼範圍 我們可以肯定2點
1:0<X<0x40 肯定是標點或其它單位元組字元
2:X<0x81||X>0x40 肯定是低位元組
如果 X>0x81 有可能是高位元組也有可能是低位元組
因此 我們可以向後一個(X-1)(或者前一個(X+1)都一樣)位元組去尋找 判斷它是什麼位元組
如果後一個(X-1)位元組是標點或者低位元組 則X肯定是高位元組
如果後一個(X-1)也是高位元組則一直尋找下去

這樣判斷下來就可以避免 編碼時出現亂碼的問題了

public boolean charCompare(byte[] str){<br /> boolean bln=false;<br /> int i=str.length-1;<br /> int j=0;<br /> System.out.println("File.charCompare() 【"+str[i]+"】");<br /> if((str[i]>0&&str[i]<0x40)){<br /> System.out.println("File.charCompare() 【標點】【"+str[i]+"】");<br /> }else if((str[i]<0&&str[i]<-127)||str[i]>64){<br /> System.out.println("File.charCompare() 【低位元組】【"+str[i]+"】");<br /> }else {<br /> while(str[i-1]<0&&str[i-1]>-127){<br /> System.out.println("File.charCompare() 【向前找】【"+str[i-1]+"】");<br /> j++;<br /> i--;<br /> }<br /> System.out.println("File.charCompare() 【找完】【"+str[i-1]+"】["+j+"]");<br /> if(j%2==0)<br /> return bln=true;<br /> }<br /> return bln;<br /> }

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.