JAVA中文乱码解决
简单地叙述
乱码是JAVA开发时经常出现的问题。 主要发生在四种情况下。
1.
系统接口之间
2.
POST提交数据
3.
获取提交数据和URL路径
4.
页面乱码
系统界面之间的乱码
双方需要定义编码方案。 例如,GBK (以下,都以GBK为例。
发送时将String按GBK转换为字节码
out.write(loginstr.get(0).getbytes ) ' gbk ' ); //out是输出流
接收时用GBK码将字节码转换为String
newstring(by,0,a,' GBK ' ); //by是字节码,a是字节码长
开机自检乱码
通常由Filter设定字符集。 开发者不需要在意。
request.setcharacterencoding (gbk );
在特殊情况下,每个servlet也可以根据上述代码进行设置。
但是,请注意,必须在获取第一个参数之前进行设置。
另外,其他的
(1) ) ) )。
在上面的代码中,只能设置post提交的request
body编码,而不是设置get方法发送的queryString的编码。 该方法告诉APP应用服务器应该用什么编码来分析从post发送的内容。
(2) ) ) )。
HttpServletRequest.getPathInfo ()返回的结果已由servlet服务器解码。
(3) ) )。
从htpservletrequest.getrequest uri ()返回的字符串没有传递到servlet服务器decoded。
(4) ) )。
POST提交的数据是请求主体的一部分。
(5) ) )。
在网页的Http标头中添加contenttype('text/html;
charset=GBK ' )的作用:
(a ) ) )。
传达浏览器网页的数据是什么样的代码;
(b ) ) )。
提交表单时,浏览器通常会根据ContentType指定的charset对表单中的数据进行编码,然后将其提交给服务器。
(c ) ) )。
此处的ContentType是http标头的ContentType,而不是网页元的ContentType。
GET乱码和URL路径乱码
URL路径的乱码是指使用中文路径,如…/中文路径/test.jsp
GET乱码需要在半成品的配置文件中设定。
(1) tomcat服务器
对于tomcat服务器,此文件为server.xml
port=' 8080 '协议=' http/1.1 '
maxThreads='150 '
连接时间out=' 20000 '
redirect port=' 8443 ' uri encoding=' gbk ' /
URIEncoding告诉服务器servlet在解码URL时使用的编码。
port=' 8080 ' . usebodyencodingforuri=' true '
/
useBodyEncodingForURI告诉服务器在解码URL时需要使用request body指定的编码。
)2) weblogic服务器
对于weblogic服务器,该文件为weblogic.xml
世界棒球经典赛
另外:
不同的浏览器会根据URLEncode自动编码以GET格式提交的中文和路径中文。
(1) ) ) )。
对于中文IE,如果在“高级选项”中选择了“始终通过UTF-8发送”,则PathInfo为URL
Encode以UTF-8编码,QueryString以GBK编码。
3358 localhost :8080/example /中国? name=中国
实际提交如下
GET /example/$E4$B8$AD$E5$9B$BD? name=$D6$D0$B9$FA
将$更改为% )
(2) ) ) )。
对于中文IE,如果在高级选项中取消通过UTF-8发送,PathInfo和QueryString将为URL
encode根据GBK进行编码。
实际提交如下
获取
/example/$D6$D0$B9$FA? name=$D6$D0$B9$fa($ (将$更改为% () ) ) ) ) ) )。
(3) ) )。
在中文firefox中,pathInfo和查询字符串都是URL
encode根据GBK进行编码。 实际提交如下
获取
/example/$D6$D0$B9$FA? name=$D6$D0$B9$fa($ (将$更改为% () ) ) ) ) ) )。
很明显,不同浏览器和同一浏览器的不同设置会影响最终URL的PathInfo编码。 对于中文IE和FIREFOX,都使用GBK代码对query字符串进行编码。
因此,一般情况下,尽量使用英语路径,而不是中文路径。 如果提交方法应尽可能使用POST,并且需要使用GET方法,请根据配置文件中的编码对PathInfo和QueryString进行URLEncode。 也就是说,直接转换为类型为$D6$D0$B9$FA的数据。
页面乱码
浏览器使用http标头中的contenttype('text/html;
charset=GBK ' )是指定用于对从服务器发送的字节流进行解码的字符集。
1.
在servlet中调用
http servlet response.set contenttype ()设置http标头的content type。
2.
Jsp:
contentType='text/html; charset=GBK'%
3.
注意: http servlet response.set content type (' text/XML; charset=GBK '; 请务必写在PrintWriter out=中=
HttpServletResponse.getWriter (之前。 否则会乱码。 以前在项目开发过程中遇到过这样的问题,尤其是在使用Ajax时
总结
1.
通常,系统只使用一个字符集以避免混乱。
2.
文件、配置文件和JSP中的
contentType='text/html; charset=GBK'%都必须写。
3.
一般路径请不要写中文。 请不要使用中文get方法(QueryString )。 如果需要在特殊情况下使用,请积极使用URLEncode。
4.
在接口通信的情况下,双方积极地定义匹配的字符集,将每个字符集转换为字节码进行交流。