精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-25
1.将所有遇到字符集的地方全部设置成utf8,这样能避免出现乱码。
2.确保存入数据库和读取数据库的字符集是一样的,也可以解决这个问题。例如,数据库的表的字符时utf8,jsp页面 上设置contentType=gbk,这样虽然编码不同,但是不会出现乱码。 3.最重要的是要设置数据库的default-character-set=utf8。 |
|
返回顶楼 | |
发表时间: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")); } |
|
返回顶楼 | |
发表时间: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数据写到文件/流/控制台上。 |
|
返回顶楼 | |
发表时间: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 又分别是以什么编码发送的呢? 再次表示感谢! |
|
返回顶楼 | |
发表时间:2010-11-30
搞个linux就不行了
|
|
返回顶楼 | |
发表时间: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参数的编码。 |
|
返回顶楼 | |
发表时间:2010-12-01
不清楚tomcat 的URIEncoding默认为什么是ISO-8859-1
|
|
返回顶楼 | |
发表时间:2010-12-03
rain2005 写道 不清楚tomcat 的URIEncoding默认为什么是ISO-8859-1
老人不知编码之痛苦~ |
|
返回顶楼 | |
发表时间:2010-12-04
如果在my.ini中设置了[mysqld]下的default-character-set=utf8 ,那么在建表的时候就不用再次指定字符集了,因为[mysql]下配置的字符集指得就是建表和建库时的缺省字符集。
|
|
返回顶楼 | |