关于web工程乱码问题-解决方案及编码习惯养成

来源:互联网 发布:天猫和淘宝什么关系 编辑:程序博客网 时间:2024/05/11 15:35

相信许多新手会和我开始时一样在web工程或者其他涉及到文件打开时会发生文字乱码,这种情况一般都是中文产生乱码,所以特别记录下乱码产生原因及解决方案。

不想了解全部流程,或只想知道如何操作解决问题直接看第三点。

在程序设计过程中经常会遇到中文乱码现象。这是程序在编写、转化、编译输出、显示过程中,中文编码设置不一致而造成的。

想要解决中文乱码现象,必须了解字符编码的过程。


一、字符从用户输入到处理保存、输出过程中使用三种编码:外码、内码、显示码

外码:作为计算机输入的键盘编码

内码:作为计算机保存时使用的编码,我们主要分析的对象。

显示码:字符显示的外观样式描述。


二、字符发展

起初,计算机字符集只有ANSI(American national standards institute)的ASCⅡ字符集,7bit表示一个字符,总计128个字符

GB2312是派生的简体中文字符集,采用双字节编码,为区分ASCⅡ字符集,所有汉字编码第一位均是1,收录汉字6763,一级汉字3755,二级3008。

由于收录汉字少,所以利用GB2312空余的编码空间,指定了GBK编码,收录汉字21003个,简繁体融于一库。并GBK并非国家正式标准。

之后产生GB18030、Unicode、UCS等字符集,在1991年前后,由Unicode和UCS两个项目参与者认识到,世界上不需要两个不同的单一字符集,于是产生了由USC实现了全世界语言文字的统一编码,这个编码也是现在大部分用的utf-8的前身,为克服UCS 等出现的缺陷,设计了UTF-8(UCS transformation Format)编码。


三、java语言中的编码实际操作

1.首先,在web中为了避免编码问题,在项目创建时设置好(文件编码)text file encoding 为UTF-8,系统默认是继承操作系统编码,这也是许多源文件在不同电脑上打开时发现注释全变成了乱码的原因。

2.其次,在web项目中静态HTML文件在浏览器输出中文乱码,在head中添加

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
3.同时,此处由于jsp文件是通过page指令 - pageEncoding属性设置传输编码,然后在后台生成HTML文件传输到前台浏览器显示,则需要在jsp文件中添加

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
4.如果涉及到传值问题,建议使用post传值,同时在表单中的输入是什么编码在获取之前使用下面方法。

反正总思想就是四个字:编码统一

request.setCharacterEncoding("utf-8");

5.对于get请求传递中文,除了指定接受数据编码外,在Tomcat的配置文件server.xml中的Connector标签中加入属性:

useBodyEncodingForURI=“true” URIEncoding=“UTF-8”
还一种不推荐的方法:在接受到数据str后可使用:str = new String(str.getBytes("页面传输过来的编码"),“你需要的编码”);

6.在Cookie中传递中文

写入Cookie : java.net.URLEncoder.encode(要保存的字符);

获取Cookie :java.net.URLDecoder.decode(保存的字符);

7.RequestDispatch转向,在调用response . getWriter()前指定response编码:

response  . setCharacterEncoding("UTF-8");

8.servlet中文编码

response.setContentType("text/html;charset=UTF-8");

8.还有可能web项目会与数据库交互,我使用的是MySQL,对其他数据库思路一致,在数据库中有许多编码,统一。

show variables like '%character%';//查看MySQL数据库编码
character_set_client     | utf8   character_set_connection | utf8   character_set_database   | utf8   character_set_filesystem | binar   character_set_results    | utf8   character_set_server     | utf8   character_set_system     | utf8


注意:我的MySQL版本是5.5.55 ,并且MySQL中UFT-8字符集是没有一杠的:utf8.


同时,如果在命令行中操作数据库会发现在命令行中查找出的数据集中文是乱码,但在web端是正常的,这是种假乱码现象,实际上没有乱码,只不过在命令行中输出默认采用GBK解码,所以无法解码,出现乱码。


以上是全部思路,楼主水平有限,如有问题还望指出。





原创粉丝点击