英文乱码问题解读政府事业部-劳动人事开发部郭志龙guozl@英文乱码问题解读:内容索引字符集与编码相关知识•字符与编码的发展•字符串在显存中的储存方式•字节、字符、字符串•字符集与编码•常用编码规则简介•编程中的字符与编码•JAVA程序中的编码实现JSP编程英文乱码问题症结及问题汇总•英文编码问题的症结•英文编码问题出现的环节•JSP文件的汉字问题•表单处理中的汉字问题•Servlet的汉字问题•JDBC的汉字问题英文乱码问题解读:字符与编码的发展字符与编码的发展,从计算机对多国语言的支持角度看,大致可以分为三个阶段:•使用ASCII编码支持中文语言阶段(英语)中文DOS•使用ANSI编码支持多种语言阶段(本地化)英文DOS,英文Windows95/98,韩文Windows95/98•在UNICODE被采用以后(国际化)WindowsNT/2000/XP...,Linux中文linux操作系统,Java英文乱码问题解读:字符与编码的发展•计算机开始只支持英文linux文件中文乱码,其它语言不能在计算机上储存和显示。
•为使计算机支持更多语言,一般使用0x80~0xFF范围的2个字节来表示1个字符。诸如:汉字'中'在英文操作系统中,使用[0xD6,0xD0]这两个字节储存。•不同的国家和地区拟定了不同的标准,由此形成了GB2312,BIG5,JIS等各自的编码标准。那些使用2个字节来代表一个字符的各类汉字延展编码方法linux学习视频,称为ANSI编码。在繁体英文系统下,ANSI编码代表GB2312编码,在英文操作系统下,ANSI编码代表JIS编码。•不同ANSI编码之间互不兼容,当信息在国际间交流时,未能将属于两种语言的文字,储存在同一段ANSI编码的文本中。•为了国际间信息交流愈加便捷,国际组织制订了UNICODE字符集,为各类语言中的每一个字符设定了统一而且惟一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。英文乱码问题解读:字符串在显存中的储存方式在使用ASCII编码支持中文语言阶段:单字节字符使用一个字节储存一个字符(SBCS)。例如,"Bob123"在显存中为:426F6231323300Bob123英文乱码问题解读:字符串在显存中的储存方式在使用ANSI编码支持多种语言阶段:每位字符使用一个字节或多个字节来表示(MBCS),为此,这些方法储存的字符也被叫做多字节字符。
例如,"英文123"在英文Windows95显存中为7个字节,每位汉字占2个字节,每位英语和数字字符占1个字节:D66DD00CECCEC431323300英文123英文乱码问题解读:字符串在显存中的储存方式在UNICODE被采用以后:计算机储存字符串时,改为储存每位字符在UNICODE字符集中的序号。目前计算机通常使用2个字节(16位)来储存一个序号(DBCS),为此,这些方法储存的字符也被叫做宽字节字符。例如,字符串"英文123"在Windows2000下,显存中实际储存的是5个序号,一共占用10个字节:2D4E87653100320033000000英文123英文乱码问题解读:字节、字符、字符串概念描述举例'1','中','a','$',字符人们使用的记号,具象意义上的一个符号。'¥',……计算机中储存数据的单元,一个8位的二进0x01,0x45,字节制数,是一个很具体的储存空间。0xFA,……在显存中,假如"字符"是以ANSI编码形ANSI式存在的,一个字符可能使用一个字节或"英文123"字符串多个字节来表示,这么我们称这些字符串(占7字节)为ANSI字符串或则多字节字符串。
在显存中,假如"字符"是以在UNICODEUNICODE"英文123"中的序号存在的,这么我们称这些字符串字符串(占10字节)为UNICODE字符串或则宽字节字符串。英文乱码问题解读:字节、字符、字符串因为不同ANSI编码所规定的标准是不相同的,为此,对于一个给定的多字节字符串,我们必须晓得它采用的是哪一种编码规则,才才能晓得它包含了什么"字符"。而对于UNICODE字符串来说,不管在哪些环境下,它所代表的"字符"内容总是不变的。英文乱码问题解读:字符集与编码各个国家和地区所制订的不同ANSI编码标准中,都只规定了各自语言所需的"字符"。诸如:汉字标准(GB2312)中没有规定日本语字符如何存贮。这种ANSI编码标准所规定的内容包含两层涵义:•使用什么字符。也就是说什么汉字,字母和符号会被收入标准中。所包含"字符"的集合就称作"字符集"。•规定每位"字符"分别用一个字节还是多个字节储存,用什么字节来储存,这个规定就称作"编码"。各个国家和地区在制定员码标准的时侯,"字符的集合"和"编码"通常都是同时制订的。为此,平时我们所说的"字符集",例如:GB2312,GBK,JIS等,不仅有"字符的集合"这层涵义外,同时也包含了"编码"的含意。
"UNICODE字符集"包含了各类语言中使用到的所有"字符"。拿来给UNICODE字符集编码的标准有好多种,例如:UTF-8,UTF-7,UTF-16,UnicodeLittle,UnicodeBig等。英文乱码问题解读:常用编码简介依照编码规则的特性,把所有的编码分成三类:单字节字符编码、ANSI编码、UNICODE编码单字节字符编码:•编码标准:ISO-8859-1•编码原理:是最简单的编码规则,每一个字节直接作为一个UNICODE字符。例如,[0xD6,0xD0]这两个字节,通过iso-8859-1转化为字符串时,将直接得到[0x00D6,0x00D0]两个UNICODE字符,即"ÖÐ"。反之,将UNICODE字符串通过iso-8859-1转化为字节串时,只能正常转化0~255范围的字符。英文乱码问题解读:常用编码简介ANSI编码:•编码标准:GB2312;BIG5;Shift_JIS;ISO-8859-2…•编码原理:把UNICODE字符串通过ANSI编码转化为"字节串"时,按照各自编码的规定,一个UNICODE字符可能转化成一个字节或多个字节。
反之,将字节串转化成字符串时,也可能多个字节转化成一个字符。例如,[0xD6,0xD0]这两个字节,通过GB2312转化为字符串时,将得到[0x4E2D]一个字符,即'中'字。•"ANSI编码"的特征:1.这种"ANSI编码标准"都只能处理各自语言范围之内的UNICODE字符。2."UNICODE字符"与"转换下来的字节"之间的关系是人为规定的。英文乱码问题解读:常用编码简介UNICODE编码:•编码标准:UTF-8;UTF-16;UnicodeBig…•编码原理:与"ANSI编码"类似的,把字符串通过UNICODE编码转化成"字节串"时,一个UNICODE字符可能转化成一个字节或多个字节。•与"ANSI编码"不同的是:1.这种"UNICODE编码"才能处理所有的UNICODE字符。2."UNICODE字符"与"转换下来的字节"之间是可以通过估算得到的。英文乱码问题解读:常用编码简介编程中比较常用的编码有:UTF-8,GBK,GB2312,ISO-8859-1•不仅ISO-8859-1之外的其它三个编码都能挺好的支持英文,但它们都兼容ISO-8859-1的编码(就是说无论编码如何改变,只要是ISO-8859-1中的字符,永远不会出现乱码)。
•这四种编码中,GB2312是中国规定的汉字编码,也可以说是繁体英文的字符集编码;GBK是GB2312的扩充,不仅兼容GB2312外,它能够显示简体英文linux文件中文乱码,还有日语的假名;而UTF-8其实也支持英文,但却与GB码不兼容(编码值不同)。UTF-8使用的是可变长的UNICODE编码,编码可能是1位16补码(即ISO-8859-1中的字符,其编码也是相同的)也有可能是2位或3位的16补码。UTF-8的优点是:•与CPU字节次序无关,可以在不同平台之间交流。•容错能力高,任何一个字节受损后,最多只会造成一个编码码位损失,不会链锁错误(如GB码错一个字节都会整行乱码),所以在国际化处理中基本都是建议使用UTF-8作为编码。英文乱码问题解读:编程中的字符与编码在C++和Java中,拿来代表"字符"和"字节"的数据类型及编码方式:类型或操作C++Java字符wchar_tchar字节charbyteANSI字符串char[]byte[]UNICODE字符串wchar_t[]Stringmbstowcs(),string=newString(bytes,字节串→字符串MultiByteToWideChar()"encoding")wcstombs(),bytes=字符串→字节串WideCharToMultiByte()string.getBytes("encoding")以上须要注意几点:•Java中的char代表一个"UNICODE字符(宽字节字符)",而C++中的char代表一个字节。
•MultiByteToWideChar()和WideCharToMultiByte()是WindowsAPI函数。英文乱码问题解读:JAVA程序中的编码实现•字符串类String中的内容是UNICODE字符串://Java代码,直接写英文Stringstr="英文123";//得到厚度为5,由于是5个字符System.out.println(str.length());•字符串I/O操作,字符与字节转换操作。在Java包java.io.*中,以"Stream"结尾的类通常是拿来操作"字节串"的类,以"Reader","Writer"结尾的类通常是拿来操作"字符串"的类。字符串与字节串间互相转化,示例如下://依照GB2312得到字节(得到多字节字符串)byte[]bytes=str.getBytes("GB2312");//从字节根据GB2312得到UNICODE字符串str=newString(bytes,"GB2312");英文乱码问题解读:JAVA程序中的编码实现要将String根据某种编码写入文本文件,有两种方式:•第一种办法:用Stream类写入早已根据指定编码转化好的字节串OutputStreamos=newFileOutputStream("1.txt");os.write(bytes);os.close();•第二种办法:构造指定编码的Writer来写入字符串Writerwr=newOutputStreamWriter(newFileOutputStream("2.txt"),"GB2312");wr.write(str);wr.close();最后得到的1.txt和2.txt都是7个字节JSP编程英文乱码问题症结及问题汇总政府事业部-劳动人事开发部郭志龙guozl@英文乱码问题汇总:内容索引字符集与编码相关知识•字符与编码的发展•字符串在显存中的储存方式•字节、字符、字符串•字符集与编码•常用编码规则简介•编程中的字符与编码•JAVA程序中的编码实现JSP编程英文乱码问题症结及问题汇总•英文编码问题的症结•英文编码问题出现的环节•JSP文件的汉字问题•表单处理中的汉字问题•Servlet的汉字问题•JDBC的汉字问题英文乱码问题汇总:英文编码问题的症结•顾客端和服务器用GB2312•HTTP传输编码用ISO8859-1•服务器须要指示顾客端文档的编码方法英文乱码问题汇总:英文编码问题出现的环节1.顾客端显示文档时的编码方法(由服务器中的JSP、Servlet指明)2.顾客端发送汉字时手动转换为ISO8859-13.服务器中采用GB2312对汉字编码,接收到顾客端汉字须要转换为GB23124.服务器端将JSP转换为Servlet时手动将汉字转换为ISO8859-15.服务器端应当告诉顾客端汉字的编码方法英文乱码问题汇总:英文编码问题出现的环节•JSP文件的汉字问题•表单处理中的汉字问题•Servlet的汉字问题•JDBC的汉字问题英文乱码问题汇总:JSP文件的汉字问题•JSP中的汉字字符串在服务器端用GB2312•在编译为Servlet时手动转换为ISO8859-1•汉字在传输中是正确的•在没有非常指示下,浏览器中未能正确显示在HTML手指示浏览器文档的编码:在JSP手指示JSP引擎文档的编码:每位要显示汉字的JSP文档都应当包含该句子英文乱码问题汇总:JSP文件的汉字问题您好英文乱码问题汇总:JSP文件的汉字问题