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