在开发中,总会碰到各种中文乱码问题,下面稍作总结。
1、数据库的乱码
出现乱码问题,我们第一反应应该是:是否数据库字符编码设置有问题。以mysql为例,装好mysql后进入安装目录,打开my.ini配置文件查看mysql设置的编码。在my.ini中有两处设置字符编码的地方,分别是[mysql]下的default-character-set及[mysqld]下的default-character-set。熟悉linux的朋友都知道以d结尾的表示服务端,如你想那样,[mysql]设置的字符编码是客户端的,[mysqld]设置的字符编码是mysql服务器端的编码。我们的数据就是存储在mysql服务器端的,为了能存下任何字符编码的数据,我们一般设置[mysqld]下的default-character-set=utf8(注意,不是utf-8)。代表客户端的[mysql]下的default-character-set应该怎么设置呢,一般朋友可能也设置成utf8,这可能会出问题的。如果这样设置的话,当我们"运行cmd"打开DOS窗口,通过"mysql -uroot -p123"命令进入mysql的客户端后,我们是不能插入中文的。道理很简单,这是因为我们的操作系统的字符编码是GBK(或GBK兼容),我们在DOS窗口输入的中文(如:insert into test values('中文'))自然也是GBK的,而我们[mysql]设置的却是utf8,因为不兼容所以会出错。当然,如果我们使用相关mysql的GUI客户端工具,进行相关设置,即使[mysql]设置成utf8也没问题。但如果通过DOS窗口登陆mysql客户端时,一般要设置[mysql]下的default-character-set=GBK。
总结:[mysql]下default-character-set=GBK,[mysqld]下default-character-set=utf8
2、使用GET请求的乱码
如果一个请求是GET方式时,比如<a href="url">标签指定的请求如form表单以GET方式提交,我们可以在浏览器地址栏上看到类似http://localhost/proj/a.do?title=%C4%E3%BA%C3 这样的URL。像这样2个(%加上2位16进制数)表示一个中文,这是用ISO8859-1(即lantin1)进行的编码。对于这样用GET请求的URL中的中文字符,我们是不能通过设置request.setCharacterEncoding("UTF-8")来解决的。
解决方法有两种:
第一种方法是用 title = new String(title.getBytes("ISO8859-1"), "UTF-8"); 来对每个有中文的请求参数进行解码再编码,这种方法比较繁琐;
第二种方法是修改tomcat的server.xml配置文件,把<Connector port="8080" ...>修改成 <Connector port="8080" ... URLEncoding="UTF-8">,即在<Connector>元素中指定其URLEncoding="UTF-8",其默认值为lantin1。这属性指定了URL的编码,设置成UTF-8后,地址栏上就不会再出现 a.do?title=%C4%E3%BA%C3 之类的内容了,而是 a.do?title=中文 。
这种方法的缺点是,其它项目或该项目其它地方可能会因为修改而引入了新的中文编码问题,比如使用这种方法之后,有些地方使用了第一种方法处理好了的中文将会再次变成乱码。这种方法不常用,可能牵一发而动全身。
3、使用POST请求的乱码
对于form表单以POST提交的请求,可以用request.setCharacterEncoding("UTF-8")来解决。至于为什么这种方法对POST请求有效而对GET请求无效,请参考HTTP协议中GET与POST请求的差别,简单来讲就是GET请求的内容放在请求头里,POST请求是放在请求体来。一般来讲我们可以通过给项目增加一个字符集过滤器来一次性解决POST请求的中文乱码。过滤器里的内容非常简单,就是调用request.setCharacterEncoding(encoding),encoding是我们要设置的字符集。过滤器可以自己编写,也可以使用spring提供的org.springframework.web.filter.CharacterEncodingFilter。
综上所述我们在中文乱码这个问题上,一般的做法如下:
1、编码集用UTF-8而不是GBK
2、给我们的应用加上一个字符集过滤器
3、所有的Form表单都以POST进行提交
4、用链接<a href="a.do?name=中文">进行的提交,最好用new String(title.getBytes("ISO8859-1"), "UTF-8")来解决而不是修改tomcat的配置文件
分享到:
相关推荐
中文乱码总结,出现的原因,及解决方法,包括数据库乱码
Qt+Visualstudio的中文乱码总结: 1、Qt4.7+VS2008,通过如下方法: .... 2、Qt5.2+VS2010 打入补丁 VS2010sp1,.... 3、 Qt5.2+ VS2012 不支持 #pragma execution_character_set ("utf-8") .... 4、Qt5.2+VS2013 ...
针对java web开发方面中文乱码情况的总结,基本各种情况都有了!
中文乱码问题整理总结 通过平时开发实践,总结的乱码问题.
中文乱码问题分析中文乱码问题分析中文乱码问题分析中文乱码问题分析中文乱码问题分析中文乱码问题分析
中文乱码处理问题总结,针对一些容易乱码的地方进行讲解。
NULL 博文链接:https://xbcxs.iteye.com/blog/800557
struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结
之前在我的公众号分享了 BurpSuite Pro v2020.1 版本,但是在使用过程中发现总是会有中文乱码的情况出现。 后来使用 Lucida 字体,乱码的情况得到了缓解,但是有些网页依旧会出现乱码的情况,直到后来才意识到问题...
JSP中文乱码问题解决总结,个人收集,一次放出,减少大家的查找时间。
总结中文乱码问题如下: 1、所有页面都用UTF-8。 2、写过滤器,设置request.setCharacterEncoding("UTF-8")。 3、javascript脚本里用encodeURI(str)。 4、适当的时候,在jsp里用java.net.URLDecoder.decode(request....
php中常见中文乱码处理方法总结,处理了php中常见的乱码问题!
初学python,深受中文乱码之害。总结了自己遇到的所有的中文乱码解决方法。写的简略,但是好使。对乱码原因做了解释,其实还是对编码不够懂,如果你懂了原理,就能自己解决了。我的环境是VSCode + Anaconda2
本文主要介绍了java中常见的中文乱码以及解决方法,具有很好的参考价值。下面跟着小编一起来看下吧
解决乱码的各种方法总结,包括数据库的解决方案,个人觉得比较详细有使用价值
阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都(更加包括我自己)没有一个清晰明了的认识,于是LZ想通过这系列博文(估计只有几篇)来彻底分析、解决java中文乱码问题,如有错误之处望各位同仁指出...
swing 开发 Linux和window系统解决乱码参考文档,个人总结,不喜勿碰
为了解决vs2010复制汉字到Word出现乱码的问题,采用两种方式进行,第一种是使用工具,是临时性的。第二种是要安装sp1可以修复该bug,是永久性的。
PHP中文乱码处理总结.docx