关于解决中文乱码问题的编码转换疑惑

大宝贱 2009-11-15 06:19:56
解决乱码总的思想就是编码一致
我的解决方案是:在网上弄了一个Filter
连接数据库是时 设置characteEncoding=gbk
然后在执行sql语句时,通常也要转换一下
sql = new String(sql.getBytes("gbk"),"ISO-8859-1");
在页面显示时,也要对要显示的数据转换一下 str = new String(sql.getBytes("ISO-8859-1"),"gbk");

在这里,我想问一下,那个Filter的作用不就是用来处理中文乱码的吗?为什么还需要后面的步骤啊?
页面的编码是gbk的,连接数据库时要characteEncoding=gbk,这个还能理解,为什么在执行sql语句和读取数据的时候又要转换啊?而且还是在gbk和ISO-8859-1之间转换,不大明白,
...全文
303 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
kun20031029 2009-11-19
  • 打赏
  • 举报
回复
filter主要解决页面与服务器端的乱码问题,而对sql进行的字符转换主要用于与数据库进行交互时保证不出现为乱码而且进行的字符集转换,楼主的数据库应该是ISO-8859-1字符集吧
dawnlch 2009-11-18
  • 打赏
  • 举报
回复
你没把页面的编码改成gbk吧给每个页面加上<%@ page contentType="text/html; charset=gbk" language="java"%>这个试试
还有你可以使用spring自带的filter进行转码,只需在web.xml里加入这段代码:
<filter>
<filter-name>Encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

或者自己写一个也行,代码大概如下:
package filter;

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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*中文乱码处理filter*/
public class SetCharacterEncodingFilter implements Filter {

private String encoding = "gbk";

public void destroy() {
}

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
request.setCharacterEncoding(encoding);
filterChain.doFilter(request, response);

}

public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter("encoding");
}

}
在web.xml里加入下面这段代码:
   <filter>
<filter-name>Encoding</filter-name>
<filter-class>filter.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gbk</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
zl3450341 2009-11-18
  • 打赏
  • 举报
回复
写个过滤器处理中文就好了
看6楼给你的代码 随便用一种
mengshan1986 2009-11-18
  • 打赏
  • 举报
回复
加了过滤器后post的数据可以不用处理,get不行的,需要在tomcat的web.xml设置编码,tomcat默认是iso-8859-1不支持中文
zhaoyuzhong 2009-11-18
  • 打赏
  • 举报
回复
和数据库关联还需要考虑数据库的字符集
panhaichun 2009-11-18
  • 打赏
  • 举报
回复
POST提交用过滤器基本没问题了。

GET提交还是得在页面编码后再提交到服务器。

tomcat配置useBodyEncodingForURI="true" 也可以解决GET提交问题,但是我发现用搜狗输入法打出的中文还是有少数字会乱码,智能ABC没问题
zl3450341 2009-11-18
  • 打赏
  • 举报
回复
页面设置
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


过滤器
package org.filter;
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 FilterChar implements Filter{

public void destroy() {
// TODO Auto-generated method stub

}


public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
arg0.setCharacterEncoding("UTF-8");
arg2.doFilter(arg0, arg1);
}


public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub

}

}


web.xml
 <filter>
<filter-name>char</filter-name>
<filter-class>org.filter.FilterChar</filter-class>
</filter>
<filter-mapping>
<filter-name>char</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
sangshusen_1988 2009-11-18
  • 打赏
  • 举报
回复
要么是过滤器没起作用,要么就是用get方式提交了
wangfeis 2009-11-18
  • 打赏
  • 举报
回复
学习。。。
大宝贱 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dawnlch 的回复:]
你没把页面的编码改成gbk吧给每个页面加上 <%@ page contentType="text/html; charset=gbk" language="java"%>这个试试
还有你可以使用spring自带的filter进行转码,只需在web.xml里加入这段代码:
XML code<filter><filter-name>Encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>Encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>
或者自己写一个也行,代码大概如下:
Java codepackage filter;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;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*中文乱码处理filter*/publicclass SetCharacterEncodingFilterimplements Filter {private String encoding="gbk";publicvoid destroy() {
}publicvoid doFilter(ServletRequest req, ServletResponse resp,
FilterChain filterChain)throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) req;
HttpServletResponse response= (HttpServletResponse) resp;
request.setCharacterEncoding(encoding);
filterChain.doFilter(request, response);

}publicvoid init(FilterConfig filterConfig)throws ServletException {this.encoding= filterConfig.getInitParameter("encoding");
}

}在web.xml里加入下面这段代码:
XML code<filter><filter-name>Encoding</filter-name><filter-class>filter.SetCharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>gbk</param-value></init-param></filter><filter-mapping><filter-name>Encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>
[/Quote]
我的每个页面都设置了<%@ page contentType="text/html; charset=gbk" language="java"%>
我看视频教程上的过滤器也是你那么写的,我用的是另一个过滤器,生成sql语句往数据库插得时候总是提示空指针异常,然后我转了一下编码就没事了,不知道怎么回事···回头用用你这过滤器····
大宝贱 2009-11-17
  • 打赏
  • 举报
回复
大宝贱 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sangshusen_1988 的回复:]
没听过加了过滤器还这么干的
[/Quote]
我也认为加了过滤器就不用其他的了,问题是只用过滤器后,向数据库插入数据,中文就是乱码
sql = new String(sql.getBytes("gbk"),"ISO-8859-1");
这个设置了之后就不是乱码了,但从数据库读取出来的时候还是乱码,所以又用了这个:str = new String(sql.getBytes("ISO-8859-1"),"gbk");
不知道是不是过滤器配置问题
bolins 2009-11-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sangshusen_1988 的回复:]
没听过加了过滤器还这么干的
[/Quote]
不会吧,这样做你还是第一次听说?你们公司写软件也是流水线的?
像华为就有很多那种代码都背得出来,但还不知道代码什么意思。
sangshusen_1988 2009-11-15
  • 打赏
  • 举报
回复
没听过加了过滤器还这么干的
bolins 2009-11-15
  • 打赏
  • 举报
回复
在URL中传递参数,它是通过HTTP表头来传递的.并不是通过表单来传递。
表单中传递的参数是在HTTP中的BODY中传送的.而设置字符过滤器只能起到过滤HTTP中BODY中的参数.而TOMCAT默认是ISO8859-1的编码方式,所以你在URL中传递过去后就是乱码了.而且过滤器也不管用了.
所以为了防止字符集不同产生的乱码问题,中文在作为参数传递的时候会因为字符集编码出现絮乱,数据在网络中是以ISO-8859-1码来传的。
为了防止程序在使用的过程中发生这种情况,所以要进行转码处理一下ISO-8859-1,国际统一认证转换方式

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧