一、JSP页面显示乱码
二、表单提交中文时出现乱码
三、数据库连
大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。
一、JSP页面显示乱码
下面的显示页面(display.jsp)就出现乱码:
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
out.print("JSP的中文处理");
%>
</body>
</html>
对不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的第一行加上:<%@ page contentType="text/html; charset=gb2312"%>,就可以消除乱码了。完整页面如下:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
out.print("JSP的中文处理");
%>
</body>
</html>
二、表单提交中文时出现乱码
下面是一个提交页面(submit.jsp),代码如下:
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form name="form1" method="post" action="process.jsp">
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>
下面是处理页面(process.jsp)代码:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,而UTF-8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过request.setCharacterEncoding("gb2312")对请求进行统一编码,就实现了中文的正常显示。修改后的process.jsp代码如下:
<%@ page contentType="text/html; charset=gb2312"%>
<%
request.seCharacterEncoding("gb2312");
%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
三、数据库连接出现乱码
只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上useUnicode=true&characterEncoding=GBK就OK了。
四、数据库的显示乱码
在mysql4.1.0中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下:
public class Convert {
/** 把ISO-8859-1码转换成GB2312
*/
public static String ISOtoGB(String iso){
String gb;
try{
if(iso.equals("") || iso == null){
return "";
}
else{
iso = iso.trim();
gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
return gb;
}
}
catch(Exception e){
System.err.print("编码转换错误:"+e.getMessage());
return "";
}
}
}
把它编译成class,就可以调用Convert类的静态方法ISOtoGB()来转换编码。
=================================================================
JSP中的乱码问题解决方案
(以下浏览器均为IE,服务器为tomcat)
服务器发送页面给浏览器时有两个地方指定encoding
一处是在http应答的header里
一处是在html文档里
1.http头设置编码
若在jsp中request.setContentType("text/html; encoding=gb2312");
这就明确告诉浏览器这篇文档是gb2312编码的,浏览器不作任何转换,只是以
gb2312来显示.若文档中有8859_1编码的字串,将会出现乱码.
若jsp中干脆就没有setContentType,服务器会把http头的中的编码设为8859_1,
浏览器通过http头就认为这篇文档是8859_1编码的(而不管文档真正的编码是什么
),会以8859_1来显示.
若文档中有8859_1编码的中文字串,只要手动调整浏览器的encoding到gb2312,浏
览器会做一个8859_1到gb2312的转换,并以gb2312来显示,你会看到正确的文字.
但这样每次都要手动来改变浏览器的encoding很麻烦.
2.在html文档中设置编码
要让html文档中设置的编码有效,必须把http头中的编码设为空.
上文说过,如果jsp中没有setContentType,服务器会把http头的中的编码设为
8859_1, 这样一来,浏览器还是只认http头中设置的编码而不认html文档中设的编
但这样每次都要手动来改变浏览器的encoding很麻烦.
2.在html文档中设置编码
要让html文档中设置的编码有效,必须把http头中的编码设为空.
上文说过,如果jsp中没有setContentType,服务器会把http头的中的编码设为
8859_1, 这样一来,浏览器还是只认http头中设置的编码而不认html文档中设的编
码.
于是,我们在jsp中来一句
request.setContentType("text/html; encoding=");
哈哈,这样浏览器就把文档默认为是8859_1编码的.
如果html文档中有
<meta http-equiv="Content-Type" content="t会出现乱码.
若jsp中干脆就没有setContentType,服务器会把http头的中的编码设为8859_1,
浏览器通过http头就认为这篇文档是8859_1编码的(而不管文档真正的编码是什么
),会以8859_1来显示.
若文档中有8859_1编码的中文字串,只要手动调整浏览器的encoding到gb2312,浏
览器会做一个8859_1到gb2312的转换,并以gb2312来显示,你会看到正确的文字.
但这样每次都要手动来改变浏览器的encoding很麻烦.
2.在html文档中设置编码
要让html文档中设置的编码有效,必须把http头中的编码设为空.
上文说过,如果jsp中没有setContentType,服务器会把http头的中的编码设为
8859_1, 这样一来,浏览器还是只认http头中设置的编码而不认html文档中设的编
但这样每次都要手动来改变浏览器的encoding很麻烦.
2.在html文档中设置编码
要让html文档中设置的编码有效,必须把http头中的编码设为空.
上文说过,如果jsp中没有setContentType,服务器会把http头的中的编码设为
8859_1, 这样一来,浏览器还是只认http头中设置的编码而不认html文档中设的编
码.
于是,我们在jsp中来一句
request.setContentType("text/html; encoding=");
哈哈,这样浏览器就把文档默认为是8859_1编码的.
如果html文档中有
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
那么浏览器就会做一个8859_1到gb2312的转换,并以gb2312来显示.
由于我们在jsp中输出的中文字串都是8859_1编码的,所有的转换都由浏览器来完成的,所以
我们看到的是正确的文字.
体会:整篇文档的encoding必须一致.
在上文第1种情况中,文档中编码不一致,出现乱码,怎么调都不行.
第2种情况中,文档中的编码都是一致的,但浏览器的显示方式不对,需手动调整.
第3种情况中,文档中的编码都是一致的(8859_1),浏览器的显示方式也对了,因此就正确了.
(以下浏览器均为IE,服务器为tomcat)
服务器发送页面给浏览器时有两个地方指定encoding
一处是在http应答的header里
一处是在html文档里
1.http头设置编码
若在jsp中request.setContentType("text/html; encoding=gb2312");
这就明确告诉浏览器这篇文档是gb2312编码的,浏览器不作任何转换,只是以
gb2312来显示.若文档中有8859_1编码的字串,将会出现乱码.
若jsp中干脆就没有setContentType,服务器会把http头的中的编码设为8859_1,
浏览器通过http头就认为这篇文档是8859_1编码的(而不管文档真正的编码是什么
),会以8859_1来显示.
若文档中有8859_1编码的中文字串,只要手动调整浏览器的encoding到gb2312,浏
览器会做一个8859_1到gb2312的转换,并以gb2312来显示,你会看到正确的文字.
但这样每次都要手动来改变浏览器的encoding很麻烦.
2.在html文档中设置编码
要让html文档中设置的编码有效,必须把http头中的编码设为空.
上文说过,如果jsp中没有setContentType,服务器会把http头的中的编码设为
8859_1, 这样一来,浏览器还是只认http头中设置的编码而不认html文档中设的编
但这样每次都要手动来改变浏览器的encoding很麻烦.
2.在html文档中设置编码
要让html文档中设置的编码有效,必须把http头中的编码设为空.
上文说过,如果jsp中没有setContentType,服务器会把http头的中的编码设为
8859_1, 这样一来,浏览器还是只认http头中设置的编码而不认html文档中设的编
码.
于是,我们在jsp中来一句
request.setContentType("text/html; encoding=");
哈哈,这样浏览器就把文档默认为是8859_1编码的.
如果html文档中有
<meta http-equiv="Content-Type" content="t会出现乱码.
若jsp中干脆就没有setContentType,服务器会把http头的中的编码设为8859_1,
浏览器通过http头就认为这篇文档是8859_1编码的(而不管文档真正的编码是什么
),会以8859_1来显示.
若文档中有8859_1编码的中文字串,只要手动调整浏览器的encoding到gb2312,浏
览器会做一个8859_1到gb2312的转换,并以gb2312来显示,你会看到正确的文字.
但这样每次都要手动来改变浏览器的encoding很麻烦.
2.在html文档中设置编码
要让html文档中设置的编码有效,必须把http头中的编码设为空.
上文说过,如果jsp中没有setContentType,服务器会把http头的中的编码设为
8859_1, 这样一来,浏览器还是只认http头中设置的编码而不认html文档中设的编
但这样每次都要手动来改变浏览器的encoding很麻烦.
2.在html文档中设置编码
要让html文档中设置的编码有效,必须把http头中的编码设为空.
上文说过,如果jsp中没有setContentType,服务器会把http头的中的编码设为
8859_1, 这样一来,浏览器还是只认http头中设置的编码而不认html文档中设的编
码.
于是,我们在jsp中来一句
request.setContentType("text/html; encoding=");
哈哈,这样浏览器就把文档默认为是8859_1编码的.
如果html文档中有
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
那么浏览器就会做一个8859_1到gb2312的转换,并以gb2312来显示.
由于我们在jsp中输出的中文字串都是8859_1编码的,所有的转换都由浏览器来完成的,所以
我们看到的是正确的文字.
体会:整篇文档的encoding必须一致.
在上文第1种情况中,文档中编码不一致,出现乱码,怎么调都不行.
第2种情况中,文档中的编码都是一致的,但浏览器的显示方式不对,需手动调整.
第3种情况中,文档中的编码都是一致的(8859_1),浏览器的显示方式也对了,因此就正确了.
=================================================================
Mysql与JSP网页中文乱码问题的解决方案
自从以前学习JSP开始,中文乱码问题就一直不断,苦不堪言。这次在项目开始之前,我们要解决的第一个问题就是把mysql的中文乱码问题搞定。经过多天的努力,终于成功的解决了中文乱码问题,特写在这里,以备后用。
软件及环境:Windows XP(2000), j2sdk1.4.2, Tomcat 5.0.25, mysql 4.1, EMS Mysql Manager 2(方便建表,版本2.8.5.1),驱动为mysql-connector-java-3.1.4-beta-bin.jar。
目标:在该环境下,实现中文的正常显示,读取与插入数据库。
注:我只在此环境下测试通过,别的系统及不同版本未测试
要点:统一字符集(JSP页面编码,mysql建库时字符集选择,连接数据库URL,request设定等)
下面我以GBK为例讲解。如果要使用utf-8,只要在相应的GBK处换成utf-8即可
--------------------------- 步骤1 以GBK字符集建库建表 -------------------------------------
我使用EMS来建mysql的数据库及表,因为它是图形界面,方便操作(就像SQL SERVER 2000中的企业管理器一样)。
建库时,从EMS菜单中选create Database...新建一个数据库,CharacterSet选gbk_bin(另一个gbk_chinese_ci不知道与这个有什么区别,我找资料也没有找到。如果你知道,请告诉我,我补充在这里)。不要把工具栏上有一个加号和数据库模样的图标当成新建数据库了,那个新注册一个已经存在的数据库。
后面建表时,也要选择同样的字符集。
建好后,此时不要用EMS向里面插入数据,否则你看到的中文依然是乱码。
--------------------------- 步骤2 连接数据库的URL后加些参数 -------------------------------
假设我新建的数据库是testdb,那么我连接数据库的url应该为:
jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=gbk
此时要注意:如果我是把这个url写在JAVA代码中,就直接这样写。但如果是在xml配置文件中(如struts-config.xml,web.xml等),要把其中的&改为&才行,否则会出错。也就是:
jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=gbk
--------------------------- 步骤3 每个JSP页面都要声明该中文字符集 ----------------------------
在每个JSP页面的最上面都加上一句
<%@ page language="java" contentType="text/html;charset=GBK" %>
这样才能保证JSP页面中的中文显示正常
--------------------------- 步骤4 加一个传递参数时设定request字符集的filter类 -----------------------
因为网络中字符在传递的时候,都是统一以iso-8859-1的编码传递,所以我们必须对request重新设定字符集,才能正常显示中文。如果采用filter类来实现,我们不用在每次取中文参数时都要重新设定。
filter类的内容:
/*
* ====================================================================
*
* JavaWebStudio 开源项目
*
* Struts_db v0.1
*
* ====================================================================
*/
package com.strutsLogin.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 中文过滤器
*/
public class SetCharacterEncodingFilter implements Filter {
// ----------------------------------------------------- Instance Variables
/**
* The default character encoding to set for requests that pass through
* this filter.
*/
protected String encoding = null;
/**
* The filter configuration object we are associated with. If this value
* is null, this filter instance is not currently configured.
*/
protected FilterConfig filterConfig = null;
/**
* Should a character encoding specified by the client be ignored?
*/
protected boolean ignore = true;
// --------------------------------------------------------- Public Methods
/**
* Take this filter out of service.
*/
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
/**
* Select and set (if specified) the character encoding to be used to
* interpret request parameters for this request.
*
* @param request The servlet request we are processing
* @param result The servlet response we are creating
* @param chain The filter chain we are processing
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet error occurs
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
/**
* Place this filter into service.
*
* @param filterConfig The filter configuration object
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
// ------------------------------------------------------ Protected Methods
/**
* Select an appropriate character encoding to be used, based on the
* characteristics of the current request and/or filter initialization
* parameters. If no character encoding should be set, return
* <code>null</code>.
* <p>
* The default implementation unconditionally returns the value configured
* by the <strong>encoding</strong> initialization parameter for this
* filter.
*
* @param request The servlet request we are processing
*/
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}//EOC
该代码来自于www.javawebstudio.com,特此感谢!
然后我们在web.xml中加一些配置,就可以了,配置如下:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>javawebstudio.struts_db.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>
放在web.xml的合适位置。一般在最后,<jsp-config>标签之前(如果有的话)
经过以上步骤,JSP和mysql的中文显示及插入就都正常了。在STRUTS中也正常。
但是,此时如果你用EMS或mysql的命令行控制台来看表中的数据,却发现它们都是????。这是怎么回事呢?
不用担心,只要我们运行下面的这几行命令,就能看到正常的中文了!
SET character_set_client = gbk;
SET character_set_connection = gbk;
SET character_set_database = gbk;
SET character_set_results = gbk;
SET character_set_server = gbk;
SET collation_connection = gbk_bin;
SET collation_database = gbk_bin;
SET collation_server = gbk_bin;
如果你用的是mysql的命令行,则直接输入就好。
如果是EMS,则在工具栏中有一个Show SQL Editor按钮,点一下,把上面的命令输入,再按一个"execute"的按钮,就行了!
而且在这种情况下,你可以甚至可以用中文名来建数据库,表名和字段名!!!!
----------------------------------------------------------------------------------------------------
但是有一点要特别注意!
像GBK,UTF-8这样的名字,在mysql与JAVA中有不同的规定,写的时候要格外注意,否则会出错。
比如GBK,在JAVA中要写成GBK,但在mysql中要写成gbk(连接数据库的URL)
比如UTF-8,在JAVA中要写成UTF-8,但在Mysql中要写成utf8
其它的字集符也有类似的区别
=============================================================
告别JSP+MySQL乱码问题V1.0
附件:告别JSP+MySQL乱码问题V1.0.rar
《JSP数据库开发实例精粹》一书问世以来, 接到许多读者求救, 其中有80%以上的问题是关于配置以及乱码问题,配置问题只要根据书中视频依次安装J2SDK, Tomcat, MySQL(Server+Client),一般都可以解决,但乱码问题让许多读者苦不堪言,现针对乱码问题解决如下,相信一定可以将仍困惑在乱码问题中的读者解救出来。
【声明】:本文仅对本文所采用的软件环境负责,如果你采用的是其他软件环境,只好自己触类旁通了。
【版本】:V1.0,最后更新于2005-8-3,请大家认准版本与时间,如果你是在几年后看到此文,请不要歉弃老土。^_^
-----------------------------------------------------------------------
【软件环境】:
OS: Windows 2000 SP4, Windows XP SP2,
JDK:j2sdk-1_4_2_08-windows-i586-p.exe,
Tomcat: jakarta-tomcat-5.0.28.exe,
MySQL: mysql-5.0.10a-beta-win32.zip;
--------------------------------------------------------------------
【写在前面的说明】 (必读):
1>本文将消除乱码分为三步:
>消除页面乱码,
>消除从MySQL中读出中文乱码,
>消除插入MySQL数据库中的中文乱码;
2>没有测试tomcat-5.5. + jdk5,但我想应该更容易些吧;
3>先安装J2SDK,后装Tomcat,如果J2SDK安装在c:\j2sdk1.4.2_08,它同时会在C:\Program Files\Java\Jre下安装一个public的Jre,在安装Tomcat时,一定要将JDK指向C:\j2sdk1.4.2_08,否则无法编译JSP;
4>注意采用本方法后,操作数据库时的相关中文数据无需做额外的字符转换处理,即在所有的字符处理过程中,都以GB2312或GBK来处理;
5>随本文发行的有两个纯JSP文件和一个SQL脚本,testCh***t.jsp用来测试“消除纯JSP和HTML页面中的乱码”,tstMySQL.jsp用来测试“消除从MySQL中读出中文的乱码”,均无需手工编译,放在任一个Web目录下即可使用。bookshop.sql为tstMySQL.jsp中用到的数据库,也为《隽隽在线书店》中的更新数据库;
6>在2k中比在XP中看到乱码的情况多一些,表现为在2K中meta标记不起作用,只能使用page指令,具体原因不太清楚,还望赐教。
7>关于MySQL的客户端功具,个人习惯使用MySQL CC,虽然它已不受支持,但本书中全部脚本(使用My SQL数据库的案例)都可以在MySQL CC中正常运行,有些在mysql-query-browser-1.1.13-win.msi出错;
8>从MySQL中读出的乱码,如果用MySQL 客户端显示正常而在网页中乱码,在确定数据库连接串中的字符集正确的情况下,把WEB-INF/classes/下,不是你创建的库删除。例如本书《在线书店》就存在此问题,让WEB-INF/classes/目录下只剩bookshop目录,则可解决乱码。
9>每次修改Bean后,最好重启tomcat,而且最好把Tomcat中Work目录下的相应目录删除,否则可能导致你的修改没有更新,陷入进一步的痛苦中……
10>修改JSP文件无需重启Tomcat;
11>用SELECT语句检索出的数据,因为使用Map缓存数据,key是区分大小写的,应统一为大写或小写。但SELECT语句与数据表之间不区分大小写;
如:
strSQL = "SELECT ID, Name FROM BookInfo "
……
rs.getInt("id"); // 错误
rs.getInt("ID"); // 正确
12>新版MySQL中加密密码不应使用password,而应使用MD5或 SHA1;本书《医院门诊》存在此问题,因而无法登录;
13>如果使用下面几步仍不能消除从MySQL中读出的中文乱码,把WEB-INF\classes\目录下非你自己开发的目录删除,此版发型的《隽隽在线书店》存在此问题;
14>如果以上方法仍有乱码存在,应该是自己程序的细节问题了,比如有些地方特意调用了编码转换函数,
如 uniStr = new String(tempByte,"ISO8859_1");
15>注意编码表示方式在JSP与MySQL中的区别,如下:
JSP: GB2312, GBK, UTF-8....
MySQL: gb2312, gbk, utf8....
-------------------------------------------------------
关键问题:编码,建议统一为GB2312或GBK,本文使用GB2312,GBK未测试;
【Step1】: 消除纯HTML页和JSP页在Tomcat环境下运行的乱码
这个是由于流览器无法选择编码方式造成的, 手动从IE中选择“GB2312”即可解决;也可以网页中加入META标记或Page指令;
META标记如下:
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
Page指令如下:
<%@ page language="java" contentType="text/html; ch***t=GB2312" pageEncoding="GB2312"%>
前面说明中已经提到, META在2K下可能不起作用(XP下时了时坏),因为简单起见,加入Page指令似乎是一个一劳永逸的事情;
总结: 加入Page指令,一定可以使纯JSP页面或HTML页面在Tomcat环境下正常显示。
【Step2】: 消除从MySQL数据库中读出中文的乱码
分为两个目标: step1: 从MySQL客户端查看中文正常, step2: 从网页中查看中文正常;
1: 在用SQL脚本创建数据库前,设置MySQL的默认编码方式为“gb2312”,
此步可以在mysql-administrator-1.1.0-rc-win.msi中完成,或者是MySQL Server向导;
这样设置完毕后再用SQL 脚本创建数据库, 注意如果SQL脚本中有设置字符集为latin1或utf-8的语句,一定要删除。
已发现目前版本《在线书店》中的SQL脚本中带有设置默认字符集为latin1,一定要删除!
创建数据库完毕后,用MySQL CC或MySQL Admin可检查所创建的数据库的字符集,如果正确,则用MySQL CC或MySQL Admin都可以正常查看中文;
2: 一般情况下,到这一步,在网页中已经基本能正常显示中文了,但凡事总有例外,可以在数据库连接串处再特别说明一下:
String url ="jdbc:mysql://localhost/BookStore?useUnicode=true&characterEncoding=gb2312";
conn=DriverManager.getConnection(url,"root","");
一般情况下用 String url ="jdbc:mysql://localhost/BookStore"应该就能正常显示中文。
总结:修改MySQL Server数据库默认字符集为“GB2312”,从MySQL读出中文可正常显示;
例外: 此时仍有可能还有乱码,如本书光盘中的《在线书店》,请参见前面的说明。
【Step3】: 消除插入MySQL数据库中的中文乱码
此步比较简单,在JSP页面中加入如下代码:
request.setCharacterEncoding("GB2312");
------------------------------------------------------
THE END, Enjoy it!
======================================================
MySql中文乱码的解决方法- -
在
mysql4.1下,一些数据库里面的中文会出现??乱码现象.因为,4.1增加了对utf8的支持,这是件好事.但是,问题是大部分的程序,都是使用的gb2312/gbk这样的编码格式,如果把它们都改成utf8格式,要转换成utf8需要解决的事情比较多.编辑器,浏览器,
mysql-server,
mysql-client,php,php-
mysql,cvs代码管理,数据库备份,还有合适的gb2312到utf8的转换工具.诸多的环节需要考虑.
数据库的格式转换,文件程序的格式转换,和
mysql-server的设置情况记录一下.
当然真正的转换,现在还没有做,现在只是做点规划.
关于??乱码,是系统相关的各个环节之间进行代码转换出现的问题,比如在shell下用mysql这个程序对数据库进行恢复,mysql会错误的把代码进行转换,导致乱码出现,
在转换之前,我们一定要清楚,文件是什么格式,数据库内部是什么格式,都要统一到utf8下来,不对的要进行格式转换.
1.数据库的转换.
以前数据库里面的字符,应该都是gb2312格式,这时,需要把所有的数据库文件导出成sql文本,然后对文本进行utf-8的格式转换.这里要注意的是一些2进值的字段内容会出问题.幸好,在我的项目中,2进值内容都进行了base64编码,如果数据库中存在2进值的内容,就要对它们进行单独的处理了.
用mysqldump把数据从mysql4.0中导出,此时得到的sql文件应该是gb2312的,然后用iconv这个程序把sql文件改为utf8
导出一个mysql4.0的库(服务器:192.168.2.2 库名:dbname):
mysqldump -h 192.168.2.2 --add-drop-table -c --set-charset=latin1 --allow-keywords --force -p -u root dbname >1.sql
内容转换utf8
iconv -c -f gb2312 -t utf8 1.sql -o 2.sql
在导入到4.1之前,先把mysql-server和mysql-client设置到utf8模式.
修改/etc/mysq1/my.cnf,在[mysqld]和[mysql]各增加1行:
[mysqld]
character_set_server = utf8
[mysql]
default-character-set =utf8
保证让服务器端和客户端都默认工作在utf8模式下,重启mysql-server后就可以导入了.
mysql -u root -h localhost test <2.sql
到这里,一个数据库就转换完成了.已经完全工作在utf8模式下了.
php的程序的修改.也可以用iconv程序.进行.
首先从cvs导出一个干净的代码拷贝,比如在net目录下,
cvs -d :pserver:xxx.xxx.xx.xx net co
删除一些不需要转换的文件
然后执行转换
find . -name "*.php" -type f -exec mv {} {}.old \; -exec iconv --verbose -f gb2312 -t utf8 {}.old -o {} \; -exec rm {}.old \;
至此,php代码就批量的转换到utf8模式.还有就是只要修改html的head的语言声明,从gb2312改成utf8,浏览器就会自动使用utf8的模式显示这个页面. content="text/html; charset=utf8"
最后,就是把编辑器改成utf8模式了.这个就比较简单了.
好了,我们的web应用已经进入utf8模式了.哈哈.
在使用MYSQL时,插入中文字符,经常会出现乱码,中文全被用?代替。
出现这种情况的原因,多是字符集不匹配造成的。
在MYSQL中,如果使用缺省的字符集,在建库、建表时,默认使用的是latin1字符集,为ISO 8859-1西欧字符集。
插入中文字符时,与之不匹配,就会出现乱码。
本人使用的是MYSQL 5.0版,并用C#操作MYSQL数据库,当插入中文字符时,发现显示的是乱码。
初步估计是字符集没有配对。查找后,发现MSYQL默认使用的是latin1,因此将数据库的配置文件中的字符设置改为utf8,并在C#中将中文字符,转为utf8,插入后,仍为乱码。
MYSQL也支持gb2312,又将MYSQL的字符设置改为gb2312,C#中使用Default,重起MYSQL后,操作仍然无效。
后想起,虽然将MYSQL的字符集设置为gb2312或utf8,但已经建立的数据库和表,仍采用的是默认的字符集,也即仍为当初的西欧字符集,最好,只得忍痛将数据库删除,重新以gb2312字符集建立数据库和表。
再用C#插入中文字符后,一切OK。
再安装好MYSQL后,可以手工或使用配置工具,将my.ini文件中的默认字符集改为gb2312,再重新建库和表时,不用再在语句中指定字符集,其默认设置也即为gb2312,可以正常显示中文字符集