閱讀50 返回首頁    go 阿裏雲 go 技術社區[雲棲]


一個€引起的混亂——關於字符編碼

     上周遊戲突發一個嚴重的漏洞,玩家通過在聊天世界頻道發送€符號,會導致接下來發言的玩家看到的內容混亂,這種搗亂的行為,我立即去查了一下,發現這是引擎在處理字符編碼時的一個錯誤導致的,這個錯誤非常隱蔽,以至於我也是開始的時候看上去一切非常正常。

 

  錯誤是這樣出現的,首先程序采用多字符集,即ANSI編碼,在多字符編碼下,用單字節表示英文編碼,用兩個字節表示非英文編碼,程序中為了顯示一段文字,先要判斷這個字符時一個單字節的英文還是多字節漢字的第一個字符。

  程序是這樣判斷的,假設到來的字符是 char c,如果c>0就是英文字符,否則就是漢字的第一個。因為引擎認為 0X00<c<0X80  範圍是標準ASC2表示的英文字符,而漢字字符的首位采用0X80以上的。乍一看起來沒問題啊,可是問題就在這個臨界的0X80上,ansi編碼的標準上說,用0X80-0Xff之間的字節表示多字節的字符,也就是說其實0X80和0Xff這兩個字符還是單字節的英文字符,所以使用0X00<c<0X80 顯然遺漏了0X80和0Xff,引擎錯誤的把0X80和0XfF當成了雙字節的第一個。而0X80正代表的英文字符€。

  其實我覺得可能很多人會這樣寫代碼,就用char c,>0判斷英文字符,其實VC為我們提供了一個良好的接口用來判斷多字符編碼下某個字節是否為一個多字節字符的前驅(即不是單字節英文字符),IsDBCSLeadByte(),用它就可以很好的解決問題。

 

  如果想看看你的代碼裏有沒有這種問題,輸入一個€看看顯示是否正常就知道了。

 

最後更新:2017-04-03 16:49:04

  上一篇:go Oracle中job的使用詳解
  下一篇:go Linux 命令學習之dpkg命令詳解