一个€引起的混乱——关于字符编码

简介:

     上周游戏突发一个严重的漏洞,玩家通过在聊天世界频道发送€符号,会导致接下来发言的玩家看到的内容混乱,这种捣乱的行为,我立即去查了一下,发现这是引擎在处理字符编码时的一个错误导致的,这个错误非常隐蔽,以至于我也是开始的时候看上去一切非常正常。

 

  错误是这样出现的,首先程序采用多字符集,即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(),用它就可以很好的解决问题。

 

  如果想看看你的代码里有没有这种问题,输入一个€看看显示是否正常就知道了。

 

目录
相关文章
|
3月前
|
存储 自然语言处理
字符编码问题之Unicode传统字符编码方案中的语言编码冲突如何解决
字符编码问题之Unicode传统字符编码方案中的语言编码冲突如何解决
45 1
|
3月前
|
存储
字符编码问题之计算机需要编码转换过程如何解决
字符编码问题之计算机需要编码转换过程如何解决
30 0
|
3月前
字符编码问题之GBK确保与ASCII码的兼容性如何解决
字符编码问题之GBK确保与ASCII码的兼容性如何解决
39 0
|
3月前
字符编码问题之GB2312编码设计来避免与ASCII字符编码冲突如何解决
字符编码问题之GB2312编码设计来避免与ASCII字符编码冲突如何解决
56 0
|
6月前
|
存储 编解码 自然语言处理
一文读懂字符编码
本文计算机的各种字符编码进行了介绍,
|
6月前
|
存储 JavaScript Java
[字符编码] 理论篇:常见字符集与编码方式
[字符编码] 理论篇:常见字符集与编码方式
164 0
|
12月前
|
存储
编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
103 0
|
存储
4.编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
4.编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
63 0
|
存储 关系型数据库 MySQL
何为字符集
何为字符集
128 0
何为字符集
|
存储 Java
【字符编码】Java编码格式探秘
  在分析Comparable和Comparator的时候,分析到了String类的compareTo方法,String底层是用char[]数组来存放元素,在比较的时候是比较的两个字符串的字符,字符用char来存储,此时,突然想到,Java里面的char可以存放中文吗?后来发现是可以的,并且由此也引出了Java中字符的编码格式问题。
124 0
【字符编码】Java编码格式探秘