中文乱码问题
1.辅文
(1)乱码的原因
字符集的冲突问题
(2)乱码的来源
A:请求乱码
在用户请求中的中文出现的乱码
B:响应乱码
在响应信息中的中文出现的乱码
C:数据库乱码
数据库中有中文产生的乱码。只会在mysql数据库中出现。
2.表单中文乱码
(1)post请求方式
(1.1)每个servlet实现请求编码、响应编码的设置
A:解决请求乱码
建议将jsp编码设置为utf-8编码,明确设置请求信息的编码格式
在用户捕获参数前,将request的数据封装编码格式指定成utf-8。
request.setCharacterEncoding("utf-8");
注意: 根据jsp文件的页面编码设置request的编码。页面上是utf-8,request中也设置成utf-8。页面是gb2312(gbk),request也设置成相应的编码。
建议设置成:utf-8。
B:解决响应乱码
解决servlet乱码
response.setContentType("text/html;charset=utf-8");
C:评价
优点:比较简单直接
缺点:每个servlet都必须进行设置
(1.2)利用过滤器自动实现请求编码、响应编码的设置
A:servlet的分类
标准servlet:实现请求应答处理的servlet,是需要手动调用才会发生作用。
过滤器servlet:是实现用户请求自动过滤自动处理功能的servlet。
监听器servlet:是实现监听其他servlet运行状况的servlet。
监听器servlet运行级别最高,过滤器次之,标准servlet级别最低,只有用户调用才会发生工作。
B:过滤器Filter
实现自过滤器接口的类,在用户请求之前会自动调用自动执行。
C:过滤器在web.xml中的配置
每个过滤器都必须在web.xml中进行配置。
<filter>
<filter-name>Filter的别名</filter-name>
<filter-class>Filter的物理地址</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter的别名</filter-name>
<url-pattern>过滤器发生作用的范围</url-pattern>
</filter-mapping>
D:评价
优点:只写一次,整个工程的请求乱码都可以自动解决
缺点:加重服务器的运行负担
(2)get请求方式
get方法不能够使用(request.setCharacterEncoding("utf-8"))这个API指定解码字符集,URL参数的解码字符集是由服务器配置来决定的,
tomcat默认采用ISO-8859-1来进行GET提交的表单数据和URL参数的解码,这时在服务器端调用request.getParameter()得到的数据是采用ISO-8859-1解码的数据,
所以是乱码。解决方法有一下两种:
A:我们可以在服务器端进行字符集的转换映射,如:string username=new String (userName.getBytes("ISO-8859-1"),"utf-8");来进行字符集的映射。
B:可以在tomcat的tomcat_home/conf/server.xml中增加 URIEncoding="utf-8",编码格式和jsp编码格式保持一致,配置如下
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="utf-8" connectionTimeout="20000" redirectPort="8443" />
3.超链接中包含中文
(1)链接地址包含中文
浏览器会对链接地址中的中文(包含其它ascii字符以外的字符,比如日文,部分的拉丁字符)进行编码,采用utf-8编码。
服务器默认情况下,采用iso-8859-1解码。此时,可以通过设置配置文件的方式,告诉服务器采用指定的编码来解码。
tomcat_home/conf/server.xml
添加 URIEncoding="utf-8",作用是,服务器对于get请求,采用"utf-8"来解码。
(2)请求参数当中包含中文
请求参数当中包含中文,浏览器也会编码,所使用编码与打开该页面时的编码一致
( 根据页面编码格式适用于google等浏览器以及ie js 打开超链接方式,比如:window.open(),window.location()等,但ie<a href="url"></a>不会对url进行编码)。
方案一:
保证页面打开时的编码与URIEncoding的设置一致,页面采用utf-8,服务器URIEncoding="utf-8".IE浏览器超链接参数需要编码时不采用<a href="url"></a>,
使用js打开超链接,或者<a href="url"></a>对url编码,与tomcat服务器解码格式一致。
方案二:
如果页面打开时的编码与URIEncoding的设置不一致,可以<a href="xxx?name=<%=URLEncoder.encode("中文","编码")%>"></a>
注意事项: IE 浏览器不会对<a href="url"></a> 按照当前页面的编码格式进行编码。
4.数据库中文乱码
只适用于Mysql数据库,将jdbcURL连接字符串进行改变。
原始的url:jdbc:mysql://localhost:3306/数据库名
改成:jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8
1.辅文
(1)乱码的原因
字符集的冲突问题
(2)乱码的来源
A:请求乱码
在用户请求中的中文出现的乱码
B:响应乱码
在响应信息中的中文出现的乱码
C:数据库乱码
数据库中有中文产生的乱码。只会在mysql数据库中出现。
2.表单中文乱码
(1)post请求方式
(1.1)每个servlet实现请求编码、响应编码的设置
A:解决请求乱码
建议将jsp编码设置为utf-8编码,明确设置请求信息的编码格式
在用户捕获参数前,将request的数据封装编码格式指定成utf-8。
request.setCharacterEncoding("utf-8");
注意: 根据jsp文件的页面编码设置request的编码。页面上是utf-8,request中也设置成utf-8。页面是gb2312(gbk),request也设置成相应的编码。
建议设置成:utf-8。
B:解决响应乱码
解决servlet乱码
response.setContentType("text/html;charset=utf-8");
C:评价
优点:比较简单直接
缺点:每个servlet都必须进行设置
(1.2)利用过滤器自动实现请求编码、响应编码的设置
A:servlet的分类
标准servlet:实现请求应答处理的servlet,是需要手动调用才会发生作用。
过滤器servlet:是实现用户请求自动过滤自动处理功能的servlet。
监听器servlet:是实现监听其他servlet运行状况的servlet。
监听器servlet运行级别最高,过滤器次之,标准servlet级别最低,只有用户调用才会发生工作。
B:过滤器Filter
实现自过滤器接口的类,在用户请求之前会自动调用自动执行。
C:过滤器在web.xml中的配置
每个过滤器都必须在web.xml中进行配置。
<filter>
<filter-name>Filter的别名</filter-name>
<filter-class>Filter的物理地址</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter的别名</filter-name>
<url-pattern>过滤器发生作用的范围</url-pattern>
</filter-mapping>
D:评价
优点:只写一次,整个工程的请求乱码都可以自动解决
缺点:加重服务器的运行负担
(2)get请求方式
get方法不能够使用(request.setCharacterEncoding("utf-8"))这个API指定解码字符集,URL参数的解码字符集是由服务器配置来决定的,
tomcat默认采用ISO-8859-1来进行GET提交的表单数据和URL参数的解码,这时在服务器端调用request.getParameter()得到的数据是采用ISO-8859-1解码的数据,
所以是乱码。解决方法有一下两种:
A:我们可以在服务器端进行字符集的转换映射,如:string username=new String (userName.getBytes("ISO-8859-1"),"utf-8");来进行字符集的映射。
B:可以在tomcat的tomcat_home/conf/server.xml中增加 URIEncoding="utf-8",编码格式和jsp编码格式保持一致,配置如下
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="utf-8" connectionTimeout="20000" redirectPort="8443" />
3.超链接中包含中文
(1)链接地址包含中文
浏览器会对链接地址中的中文(包含其它ascii字符以外的字符,比如日文,部分的拉丁字符)进行编码,采用utf-8编码。
服务器默认情况下,采用iso-8859-1解码。此时,可以通过设置配置文件的方式,告诉服务器采用指定的编码来解码。
tomcat_home/conf/server.xml
添加 URIEncoding="utf-8",作用是,服务器对于get请求,采用"utf-8"来解码。
(2)请求参数当中包含中文
请求参数当中包含中文,浏览器也会编码,所使用编码与打开该页面时的编码一致
( 根据页面编码格式适用于google等浏览器以及ie js 打开超链接方式,比如:window.open(),window.location()等,但ie<a href="url"></a>不会对url进行编码)。
方案一:
保证页面打开时的编码与URIEncoding的设置一致,页面采用utf-8,服务器URIEncoding="utf-8".IE浏览器超链接参数需要编码时不采用<a href="url"></a>,
使用js打开超链接,或者<a href="url"></a>对url编码,与tomcat服务器解码格式一致。
方案二:
如果页面打开时的编码与URIEncoding的设置不一致,可以<a href="xxx?name=<%=URLEncoder.encode("中文","编码")%>"></a>
注意事项: IE 浏览器不会对<a href="url"></a> 按照当前页面的编码格式进行编码。
4.数据库中文乱码
只适用于Mysql数据库,将jdbcURL连接字符串进行改变。
原始的url:jdbc:mysql://localhost:3306/数据库名
改成:jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8