AS3 Socket 漢字亂碼深入研究

2021-05-23 17:48:49 字數 2106 閱讀 1542

正所謂眼見為實,耳聽為虛,在程式設計開發時,聽別人說的東西一定要自己進行驗證。因為網路這個東西,跟風的東西太多,以訛傳訛的事情比比皆是。近來

在做as3

與.net

的socket

通訊工作,相繼解決了通訊協議解析和資料粘包等問題,終於要跟漢字編碼這個問題一爭高下了。在經歷了一番深入研究之後,我終於將漢字亂碼這個問題徹底解決了,以後不管它

as3的

socket

要跟誰通訊,我的辦法都可以讓你在面臨漢字亂碼問題時知道該怎麼辦了。

要說as3

的socket

傳送漢字,首先得認識

as3的兩個類:

flash.net.socket

和flash.utils.

bytearray

,這兩個類的協作關係就是

bytearray

將字串(包括漢字)按照特定的編碼格式轉化成位元組陣列,然後

socket

類將這個位元組陣列傳送出去。整體思路是很簡單的。

但是這裡面有個陷阱或者說很多人在講解

flash

亂碼問題時沒有說清楚的問題。這也是我開始遇到亂碼問題時非常困惑的地方。首先,我們來介紹這個問題的所在:

bytearray

有兩個函式可以轉化漢字成位元組陣列:

第乙個是writemultibyte;另

第二個是

writeutfbytes;

這兩個方法有何區別?

這正是亂碼問題之所在!我們來做個試驗加以說明.試驗方式如下:設定乙個字串「曹操」,然後分別用

bytearray

的這兩個方法將其轉化成位元組陣列,然後讀出位元組陣列的內容看看結果,看到位元組陣列內容的時候大家就會有所收穫了。

var arrbuffer:bytearray=new bytearray(); var strtest:string="曹操"; arrbuffer.writemultibyte(strtest,"utf8");

讀出這個位元組陣列的內容,得到的位元組值是:-78 -36 -78 -39 ,每個漢字佔兩個位元組。我們在來看下面的例子

var arrbuffer:bytearray=new bytearray(); var strtest:string="曹操"; //arrbuffer.writemultibyte(strtest,"utf8"); arrbuffer.writeutfbytes(strtest);

讀出這個位元組陣列的內容,得到的位元組值是:-26 -101 -71 -26 -109 -115 ,很明顯的,每個漢字佔到三個位元組。

陷阱已經顯露出來了,在解決漢字亂碼這個問題的時候,我查了很多的網上資訊,見到最多的一行**就是

arrbuffer.writemultibyte(strtest,"utf8")了,也不做什 麼

說明,根本就是誤人子弟嘛。現在,這個問題被我揪出來了。大家如果還有什麼疑問,就繼續往下看。

經我查證,

unicode

字符集在編碼漢字的時候,應該是乙個漢字三個位元組的,為何第一次試驗的時候用

arrbuffer.writemultibyte(strtest,"utf8");

得到的卻是乙個漢字兩個位元組呢?我又試驗性的將編碼格式那個引數換成

"gbk"

和"gb2312"

,結果得到的位元組陣列與

"utf8"

時一樣。我還沒有搞清楚這是引數失效還是

adobe

有別的什麼考慮。但是試驗已經很清楚的告訴我們了乙個事實:如果你想將漢字用真正的

utf-8

編碼的話,就用

bytearray

的writeutfbytes

函式來解決問題。不要再用

writemultibyte(strtest,"utf8")

了。這個函式是不會將漢字轉化成

utf編碼的。

至於.net

端,我就不多著筆墨了,要在

.net

端轉化漢字編碼時,

encoding

和unicodeencoding這兩個類開啟看看,使用合適的編碼類和函式就可以解決問題了。實在還是有問題,按照我解決flash端編碼的經驗,檢視實際編碼得到的位元組值,你也就能夠找到合適的編碼集來解決問題了。

as3 socket 跨域連線

socket跨域連線 例如 189.45.3.11上的swf socket程式訪問,345.22.345.8伺服器上的socket的服務端程式,這就是跨域連線 關於as3 socket跨域連線的時候如何解決跨域安全沙箱限制問題,網路上有很多方法。這裡說點,需要注意的事項 作為socket serve...

關於 AS3 Socket 通訊基礎(四)

4.同socket伺服器進行握手,並確定收到了什麼樣的資料和如何處理這些資料.建立不同的常量來宣告協議的狀態.使用這些常量將指定的處理函式對映到相應的狀態.在乙個socketdata事件控制器中,通過狀態對映呼叫這些函式的.建立socket連線通常要處理握手這個環節.尤其是在伺服器初始化需要向客戶端...

解決vs 2010複製漢字到Word出現亂碼

解決方案出處 工具 現在安裝sp1也可以修復這個bug try 另外新建乙個dataobject物件 dataobject newdataobject new dataobject rtf格式用修改後的字串,其餘的還原 foreach string t in dataobject.getformat...