2007-09-07

Decode IM content

之前幫公司所代理的一個網路封包解析產品寫一個plugin,這plugin的目的是要能夠把IM的封包內容解析出來,一般的封包解析軟體都只有把raw packet給解出來,這產品當然也不例外,所以我們就想在這上面加一個plugin來做這件事。
在寫這plugin過程中,由於原廠是用.NET2003來開發,也讓我有機會熟悉.NET2003,並用它來完成工作。

原廠有提供一個半成品,這個半成品能處理英文的訊息,中文訊息會變成亂碼,我看了程式碼之後發現其實程式當中已經有做多國語言的處理,包括定義UNICODE,_UNICODE,在把char*丟給CString之前也做了_T,另外也呼叫了A2T等marco,但是看到的就是亂碼。

查了資料後發現Windows 2000/XP等版本已使用unicode當預設的language encoding,所以所有非unicode的字元需轉成unicode才能正確顯示,否則一律當ascii處理,但IM封包內容的language encoding,就我decode的結果發現它其實是以UTF8來encoding,因此我在程式當中加上了MultiByteToWideChar()來把raw packet的訊息部分轉成"寬字元"(?),再丟進CString以及CListCtrl(程式當中的GUI使用CListCtrl來顯示封包內容),這樣才完成所有轉換工作以及最終的正確顯示unicode字元。

這是我之前在改寫這plugin時發現程式得這樣轉才正確,只是不知道是不是一定得這麼麻煩,因為我也找到其他資料發現似乎新版的VC++已不再需要呼叫MultiByteToWideChar()就能正確轉碼,只需透過_T及A2T的轉換就行,但這方式在我環境就是不work。

No comments: