论坛首页 综合技术论坛

彻底解决MySql在UTF8字符集下乱码问题

浏览 18759 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-11-25  
1.将所有遇到字符集的地方全部设置成utf8,这样能避免出现乱码。
2.确保存入数据库和读取数据库的字符集是一样的,也可以解决这个问题。例如,数据库的表的字符时utf8,jsp页面 上设置contentType=gbk,这样虽然编码不同,但是不会出现乱码。
3.最重要的是要设置数据库的default-character-set=utf8。
0 请登录后投票
   发表时间:2010-11-25   最后修改:2010-11-25
sdh5724 写道
所谓的彻底解决难道一竿子全部设置成UTF8啊。 看来charset要彻底的理解还是困难。

如果彻底的理解字符集合, 完全可以做到 数据库/JSP/HTML/driver全部都是不一致的编码。 能做到这些完全是因为JAVA内部的处理是UNICODE。 也就是每个经过JAVA处理的东西, 只要告诉JAVA处理目标的编码即可。 另外, 也就是, 要在客户端能正确看到, 也要告诉JAVA输出的目标的编码是什么。

我举个例子
1. 读取GBK的数据库的数据
2. 读取gb2312的文件
3. 读取UTF8编码的模板文件
在经过JAVA处理后, 我们可以统一输出到一个gb1830的HTML文档里去。
当然, 这样的处理99%的字符肯定是对的。 我也遇到个别字符的特殊情况。 主要是UTF8/GBK之间存在一些字符映射不存在。 



 @Test
	public void test() throws Exception{
		byte[] bytes="中".getBytes("utf-8");
		String wd=new String(bytes,"gbk");
		System.out.println(new String(wd.getBytes("gbk"),"utf-8"));//为什么乱码?
	}


改成如下则输出则无乱码,为什么?
 @Test
	public void test() throws Exception{
		byte[] bytes="中".getBytes("utf-8");
		String wd=new String(bytes,"iso-8859-1");
		System.out.println(new String(wd.getBytes("iso-8859-1"),"utf-8"));
	}

0 请登录后投票
   发表时间:2010-11-25  
回楼上:
byte[] bytes="中".getBytes("utf-8");    //这句代码告诉我, 你的文件是UTF8写的。 编译的时候必须指定JAVA文件的编码
System.out.println(new String(wd.getBytes("gbk"),"utf-8"));//你告诉我, 你的控制台是UTF8编码的。

为什么, 第二个能不乱码呢, 这是因为iso-8859-1的转化是做的一对一的字节映射,他永远是不会错的。 这样的做法实际是错误的, 能正确显示的唯一原因是因为这个iso8859-1的编码转化的时候是什么事情也没有做。

第一个会错是因为, 你用了一个GBK的字节码变换成UTF8编码, 很明显这样做是不对的。怎么可能用GBK直接转成UTF8呢。。。。

JAVA中间过程你理解下:
读文件是用GBK===》内存的里string已经是UNICODE了, 跟GBK没有关系了。
然后, 你想用UTF8输出到流文件里去。 自然是   byte[] bytes=string.getBytes("utf-8");  然后把bytes数据写到文件/流/控制台上。











1 请登录后投票
   发表时间:2010-11-25   最后修改:2010-11-25
TO:sdh5724

非常感谢您的指点!以前一些错误的理解终于搞清了,只是还有一点不太明白:

对浏览器发送的请求http://abc.com/?s=中文,是以什么编码发送的,gbk?utf-8?还是其他的?
对于请求
http://abc.com/?s=%E4%B8%AD
http://abc.com/?s=english
又分别是以什么编码发送的呢?

再次表示感谢!
0 请登录后投票
   发表时间:2010-11-30  
搞个linux就不行了
0 请登录后投票
   发表时间:2010-11-30  
ch_space 写道
TO:sdh5724

非常感谢您的指点!以前一些错误的理解终于搞清了,只是还有一点不太明白:

对浏览器发送的请求http://abc.com/?s=中文,是以什么编码发送的,gbk?utf-8?还是其他的?
对于请求
http://abc.com/?s=%E4%B8%AD
http://abc.com/?s=english
又分别是以什么编码发送的呢?

再次表示感谢!



我只说通常情况:
根据URI规范, URL的?前面的部分是使用UTF8编码的。 这是规范要求, 但是在国内的一些应用上有违反的情况。
但是?后面的部分是根据当前的网页的编码/或者你浏览器的语言/OS语言来识别的。 也就是说, 这个编码不是固定的。 通常, 在我们中文的WINDOWS/IE 上, 肯定发送的是GBK编码的内容。
为了让WEB SERVER能识别这样的情况, WEB SERVER容器可以设置URL参数的编码。
1 请登录后投票
   发表时间:2010-12-01  
不清楚tomcat 的URIEncoding默认为什么是ISO-8859-1
0 请登录后投票
   发表时间:2010-12-03  
rain2005 写道
不清楚tomcat 的URIEncoding默认为什么是ISO-8859-1


老人不知编码之痛苦~
0 请登录后投票
   发表时间:2010-12-04  
如果在my.ini中设置了[mysqld]下的default-character-set=utf8 ,那么在建表的时候就不用再次指定字符集了,因为[mysql]下配置的字符集指得就是建表和建库时的缺省字符集。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics