Android中文亂碼解決方法

2021-06-23 04:06:16 字數 1784 閱讀 7403

android中文亂碼解決方法:

在手機與pc之間進行socket或http通訊時,常常會出現中文亂碼問題,其主要原因在於手機端字元編碼預設為utf-8,而伺服器pc端預設為gbk或gb2312。

手機到pc的資訊編碼傳遞、接收、解碼顯示的過程為:手機端以utf-8編碼資訊(包括漢字),寫入socket輸出流。在寫入輸出流,或在socket中傳遞時,或在pc端讀取來自手機的socket流資訊時,系統把資訊編碼進行了一次轉換(經程式設計驗證應該是轉為gbk),這樣在pc端預設以gbk方式解碼顯示來自手機的資訊,出現中文亂碼也就不足為奇了。

根據以上分析,要解決pc端顯示中文亂碼的問題,必須在pc端對接受的手機端資訊進行轉碼,具體過程如下:

1、手機端:

手機端一般可保持預設操作方式即可。當然,執行下述操作也不會產生錯誤輸出:

strsend = new string(strsend.getbytes(), "utf-8");

該操作是按照(手機)當前作業系統的編碼格式獲取字串strsend的編碼位元組(陣列),再轉換為utf-8字串,進行傳遞。由於手機端預設使用utf-8編碼,所以該操作實際上是多餘的。當然,你也可以將操作中第二個引數改變,轉換其它編碼格式傳遞試一下。

2、pc端:

tempstr = new string(mstrmsg.getbytes("gbk"),"utf-8");或者:

tempstr = new string(mstrmsg.getbytes(),"utf-8");

pc端的操作就是以預設編碼方式(這裡為gbk)獲取接收到字串編碼位元組,再轉換為utf-8格式的字串顯示,以呼應手機端utf-8的編碼格式。

在本例所使用的裝置環境下,只有轉換為utf-8才可以正確顯示中文,轉為其它格式都會出現亂碼。其原因應該是手機端編碼為utf-8,pc端則須相應以utf-8解碼。

這裡兩行語句的不同之處僅在於getbytes()是否帶引數,不帶引數表示以當前預設編碼格式獲取位元組陣列,帶引數表示以給出的特定編碼格式獲取字串的位元組陣列。 

另外,經實驗,pc端所接收的手機端傳送來的中文資訊,再次傳回手機模擬器時不需要轉換編碼,否則手機端可能會顯示亂碼。這就出現了下面有趣的操作:

mprintwriter.println(mstrmsg + new string("  測試".getbytes("utf-8")));

其中mstrmsg為從手機端獲取的包含漢字的資訊,發回手機時不需要轉換,而附加的漢字資訊"  測試"則需要執行轉碼操作。而且只能以new string("  測試".getbytes("utf-8"))的方式獲取utf-8編碼位元組陣列,並生成utf-8字串;如果換成new string("  測試".getbytes(),"utf-8")語句,則還是亂碼。

從以上分析可以看出,utf-8和gbk等之間的編碼、解碼、轉換等操作,需要非常小心,否則會出現很多意想不到的錯誤。而且,上述解決方案也並非完善,如果漢字字數為奇數時,最後乙個漢字還會是亂碼,或"??"。

究其原因,主要是gbk的漢字編碼為2位元組;而utf-8的漢字編碼則為3位元組。

為了解決奇數個漢字末尾的亂碼問題,需要採用從socket輸入流直接讀取位元組再轉碼的方式:

以下是pc端的部分**:

......

private inputstream inputstream;

......

while (true) else  }

......

手機模擬器端與此類似。

參考文章:

《android應用開發揭秘》

關於android與pc通訊時中文亂碼的分析和解決

android http中文亂碼問題總結

linux中文亂碼解決方法

在使用centos 系統時,安裝的時候可能你會遇到英文的centos系統,在這中情況下安裝centos系統時是預設安裝 即英文 安裝完畢後,出現的各種中文亂碼。那麼,我們如何解決這種問題呢。一 centos系統訪問 g.cn 發現中文亂碼。於是用以前的方式 yum y install fonts c...

Tomcat Mysql中文亂碼解決方法

在tomcat mysql開發中,中文亂碼問題是乙個比較常見的問題,在查詢網路相關資料後,我把我的實踐經驗總結於本文。本文主要解決頁面亂碼和資料庫亂碼2個問題。1 頁面亂碼。1 編寫乙個過濾器。public class setcharacterencodingfilter implements fi...

中文亂碼解決方法 彙總

1.以post方式提交的表單資料有中文字元。我用個例子來說。比如就gbk來說吧 web容器的預設編碼是iso 8859 1.在servlet jsp中,在提交表單資料之 前,容器先呼叫request.setcharacterencoding gbk 來指定正文的字 符編碼方式為gbk,後在用resp...