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

简介:

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

 

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

 

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

 

目录
相关文章
|
30天前
|
存储 自然语言处理 Linux
探究C/C++编码世界:从字符编码到中文处理之艺(三)
探究C/C++编码世界:从字符编码到中文处理之艺
43 2
|
30天前
|
自然语言处理 C++
探究C/C++编码世界:从字符编码到中文处理之艺(二)
探究C/C++编码世界:从字符编码到中文处理之艺
34 2
|
30天前
|
存储 自然语言处理 程序员
探究C/C++编码世界:从字符编码到中文处理之艺(一)
探究C/C++编码世界:从字符编码到中文处理之艺
34 1
|
4月前
|
存储 JavaScript Java
[字符编码] 理论篇:常见字符集与编码方式
[字符编码] 理论篇:常见字符集与编码方式
64 0
|
5月前
|
存储
编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
39 0
|
5月前
|
存储
4.编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
4.编码集的作用是什么?说出几个常见的编码集?为什么常用utf-8?
16 0
|
9月前
|
存储 Java 关系型数据库
【精炼易懂】字符集、编码、乱码问题、ASCII、GBK、Unicode、UTF-8详解+实例说明
【精炼易懂】字符集、编码、乱码问题、ASCII、GBK、Unicode、UTF-8详解+实例说明
4938 4
|
存储 编解码 自然语言处理
一文读懂字符编码
前言说起字符编码,让我想起了科幻巨作《三体》里的星外文明画面人类第一次近距离看到四维物体魔戒,卓文用中频电波发送了一个问候语。这是一幅简单的点阵图,图中由六行不同数量的点组成了一个质数数列:1,3,5,7,11,13.他们没有指望得到应答,但应答立刻出现了.....空艇收到了来自“魔戒”的一系列点阵图,第一幅是很整齐的一个8×8点阵,共六十四个点;第二幅图中点阵的一角少了一个点,剩下六十三个;第三
一文读懂字符编码
|
存储 关系型数据库 MySQL
何为字符集
何为字符集
112 0
何为字符集
|
存储 Java
【字符编码】Java编码格式探秘
  在分析Comparable和Comparator的时候,分析到了String类的compareTo方法,String底层是用char[]数组来存放元素,在比较的时候是比较的两个字符串的字符,字符用char来存储,此时,突然想到,Java里面的char可以存放中文吗?后来发现是可以的,并且由此也引出了Java中字符的编码格式问题。
99 0
【字符编码】Java编码格式探秘