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

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

 

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

 

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

 

时间: 2024-12-30 12:28:39

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

JAVA里字符编码的探索与理解

编码 今天终于把JAVA里一个比较头痛的问题--字符编码弄清晰了,所以写一篇文章来纪念一下,也为大家提供一点自己的心得. 众所周知,JAVA为了国际通用,用的是UNICODE来保存里面的字符.而UNICODE只是一个种字符集,字符的存储和表示要用到一定的字符编码格式,而与UNICODE对应的字符编码格式就是我们常看到的UTF-8,UTF-16等等,而UTF-8是最常用的,所以人们常常把它和UNICODE等同起来(我以前就是这样的),这在某些情况下是没有错的,但这样的理解在JAVA里就会产生一些混

字符编码掠影:现代编码模型

Abstract 字符编码,在计算机导论中经常作为开门的前几个话题来讲,然而很多CS教材对这个话题基本都是走马观花地几页带过.导致了许多人对如此重要且基本的概念认识模糊不清.直到在实际编程中,尤其是遇到多语言.国际化的问题,被虐的死去活来之后才痛下决心去重新钻研.诸如此类极其基础却又容易被人忽视的的知识点还有:大小端表示,浮点数细节,正则表达式,日期时间处理等.本文是系列的第一篇,旨在阐明字符编码这个大坑中许多纠缠不清的概念. 基本概念 现代编码模型自底向上分为五个层次: 抽象字符表 ACR (

字符编码详解——彻底理解掌握编码知识,“乱码”不复存在

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://polaris.blog.51cto.com/1146394/377468  每一个程序员都不可避免的遇到字符编码的问题,特别是做Web开发的程序员,"乱码问题"一直是让人头疼的问题,也许您已经很少遇到"乱码"问题,然而,对解决乱码的方法的内在原理,您是否明白?本人作为一个程序员,在字符编码方面同样遇到不少问题,而且一直对各种编码懵懵懂懂.不清不楚:

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个阳光明媚的周末,一个又一个的周末,周而复始,不断学习,前方的路你可曾看见?随我一起走进技术的世界,流连忘返吧! 一.打印流PrintWriter 打印流有PrintWriter和PrintStream,他的特点可以直接操作输入流还有文件 该流提供了打印方法,可以将各种数据类型原样打印 file对象

jsp 字符编码的一个问题

问题描述 jsp 字符编码的一个问题 为了让浏览器以UTF-8编码显示JSP页面,请问下列JSP代码正确的是: A:<% page contentType = B:<meta http-equiv = C:把所有的输出内容重新编码:new String (content.getBytes()) D:response.setContentType() 答案是D,为什么A不行呢,谢谢!!! 解决方案 题目已经说的很明显,是为了让"浏览器" 浏览器属于客户端, JSP属性服务器解

Unicode字符编码标准

1. 编码知识  1.1 文本和字符  在计算机程序中或者数据文件里,文本(text)是作为数字序列存储的.序列中的数字是具有不同大小.取值和解释的整数.如何解释这些整数是由字符集(character set).编码(encoding)决定的.  文本主要是由字符(character)组成.在格式文本(fancy text, or rich text)中包括显示属性,如颜色.斜体字.上标等,但仍然是以字符组成的纯文本(plain text)为基础的.有时,格式文本与纯文本之间的区别很复杂,依赖于

字符编码浅谈

你是否认为"ASCII码 = 一个字符就是8比特"?你是否认为一个字节就是一个字符,一个字符就是8比特?你是否还认为你是否还认为UTF-8就是用8比特表示一个字符?如果真的是这样认为认真读完这篇文章吧! 为什么要有编码? 首先大家需要明确的是在计算机里所有的数据都是字节的形式存储,处理的.我们需要这些字节来表示计算机里的信息.但是这些字节本身又是没有任何意义的,所以我们需要对这些字节赋予实际的意义.所以才会制定各种编码标准. 编码模型 首先需要明确的是存在两种编码模型 简单字符集 在这

文件名的字符编码和c的fopen函数问题

问题描述 文件名的字符编码和c的fopen函数问题 问一个问题,文件名的存储和文件名的显示应该是两回事吧 中文版windows的环境字符集是GBK GBK中"茅"的编码是 195 169(十进制) 如果我在中文版windows里看到个文件叫"a茅" 那么他的文件名在硬盘中的存储方式应该是97 195 169 我编了个c程序如下: FILE *fp; char b[100]={'a',195,169,0}; strcat(b,".html"); i

tomcat下的jsp和servlet的字符编码问题

js|servlet|编码|问题 使用filter来改变request的编码 在前面的文章里面,我们讨论了在tomcat下的jsp和servlet的字符编码问题! 知道当没有指定request的编码的时候,从客户端得到的数据是iso-8859-1编码的(request.getParameter()得到传递的参数值): 但是我们怎么来改变request的编码呢? 方法有很多种!  比如:在getRequestDispatcher("/jsp/jsptoserv/hello.jsp").f