`
kzwang
  • 浏览: 6701 次
  • 性别: Icon_minigender_1
  • 来自: 乌鲁木齐
最近访客 更多访客>>
社区版块
存档分类
最新评论

中文乱码的总结

    博客分类:
  • Java
阅读更多

 

在开发中,总会碰到各种中文乱码问题,下面稍作总结。

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的配置文件

17
8
分享到:
评论
12 楼 liaobin665 2010-09-25  
楼主说的好啊············我加油顶啊·········
11 楼 weir2009 2010-09-23  
javaeye的收藏功能有问题了
10 楼 hunnuxiaobo 2010-09-20  
总结这几点,可以以不变应万变了。。
9 楼 zjshan 2010-09-20  
总结得很详细,O(∩_∩)O~
8 楼 smiky 2010-09-17  
kzwang 写道
qingtian16265 写道
针对GET的请求,可以通过Encode.encode()方法来对URL中的中文编码,在数据接收端通过两次调用Decode.decode(),就可以解析出中文字符...

这不是更麻烦吗,在两边都要处理,还可能出错的

一般情况下只有一次decode,因为默认情况下服务器端会来decode一次,这样encode一次之后基本可以杜绝乱码了哦,
上次同事遇到个问题,一个很长的URL己经用UTF-8编码过一次,在firefox将url copy出来,发现编码居然变成了GBK,没办法,再encode一次,在服务器端再加一次decode,搞定
7 楼 kzwang 2010-09-17  
ytsmtxxi 写道
楼主,就mysql,除了你刚才说的那样子,我个人觉得应该还会乱码。你现在是把数据库的编码改过来了。但是数据库里的表也有个编码的。你也应该同样的把表的编码改成一致。这样子也就不会再出现乱码了,不然还会有可能出现乱码的。

支持一下。

是的,所以最好是装好mysql时就设置好编码,重启mysql服务
6 楼 kzwang 2010-09-17  
qingtian16265 写道
针对GET的请求,可以通过Encode.encode()方法来对URL中的中文编码,在数据接收端通过两次调用Decode.decode(),就可以解析出中文字符...

这不是更麻烦吗,在两边都要处理,还可能出错的
5 楼 jerryhanwei 2010-09-17  
再补充一下,可以两次编码,两次解码,经过实践检验,觉得不会乱码,这个是终极解决方案。。。。
4 楼 qingtian16265 2010-09-17  
针对GET的请求,可以通过Encode.encode()方法来对URL中的中文编码,在数据接收端通过两次调用Decode.decode(),就可以解析出中文字符...
3 楼 ytsmtxxi 2010-09-17  
楼主,就mysql,除了你刚才说的那样子,我个人觉得应该还会乱码。你现在是把数据库的编码改过来了。但是数据库里的表也有个编码的。你也应该同样的把表的编码改成一致。这样子也就不会再出现乱码了,不然还会有可能出现乱码的。

支持一下。
2 楼 topxiaohei 2010-09-16  
          这个遇见乱码我头都大了
  


       支持楼主多多发帖
1 楼 qiuyunanjichong 2010-09-16  
很久没看到这么系统的总结了 支持楼主

相关推荐

    中文乱码总结出现的原因,及解决方法,包括数据库乱码

    中文乱码总结出现的原因及解决方法,包括数据库乱码 中文乱码是一个常见的问题,它可能出现在 Java 和 JSP 文件中,也可能出现在 Java 程序与其他媒介交互时。以下是中文乱码的原因和解决方法: Java 和 JSP 文件...

    Qt+Visualstudio的中文乱码总结

    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 ...

    jsp中文乱码总结包括 ajax中文乱码

    针对java web开发方面中文乱码情况的总结,基本各种情况都有了!

    AJAX中文乱码总结

    中文乱码问题在AJAX应用中时有出现,主要表现为从服务器获取的数据在前端显示时出现乱码。本篇文章将对AJAX中文乱码问题进行深入探讨,并提供解决策略。 1. 乱码产生的原因 - 数据编码不一致:服务器返回的数据...

    中文乱码问题分析 自己总结的

    中文乱码问题分析 中文乱码问题是 Java 和 JSP 开发中的一种常见问题,主要是由于 Java 和 JSP 源文件的保存方式是基于字节流的,而编译成 class 文件过程中,使用的编码方式与源文件的编码不一致所致。在 Java ...

    中文乱码处理问题总结

    ### 中文乱码处理问题总结 #### 一、引言 在进行中文字符处理时,经常会出现乱码问题。这主要是因为不同的系统、程序或组件可能采用不同的编码方式,而这些编码方式之间的转换不当就会导致乱码现象。本文将重点...

    java中常见的中文乱码总结

    Java 中文乱码总结 Java 中文乱码是指在 Java 应用程序中出现的中文字符显示不正确的问题。这种问题的出现是由于编码方式的不同引起的。下面我们将详细介绍 Java 中文乱码的原因、解决方法和防止乱码的技巧。 一、...

    Lua文件反编译汉字乱码处理

    总结来说,解决Lua文件反编译后汉字乱码问题,关键在于识别和处理正确的字符编码。通过检查和配置反编译工具、转换文件编码、自定义解码算法以及调整开发环境设置,都可以有效地应对这一挑战。对于开发者来说,理解...

    在eclipse中中文汉字乱码的解决方案

    Eclipse 中中文汉字乱码的解决方案 Eclipse 是一个功能强大且广泛使用的集成开发环境(IDE),但是在使用过程中,用户可能会遇到中文汉字乱码的问题。本文将为大家分享解决 Eclipse 中中文汉字乱码的方案,以便大家...

    struts处理中文乱码问题总结

    struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结

    express中文乱码解决

    ### Express 中文乱码解决方法 在Web开发中,尤其是使用Node.js的Express框架进行后端开发时,处理中文字符可能会遇到乱码问题。这通常是因为客户端与服务器之间的编码设置不一致导致的。本文将详细介绍如何在...

    C# 将中文乱码转换成中文

    本文将深入探讨如何使用C#语言解决中文乱码问题,将乱码文本正确转换为可读的中文。 ### 核心知识点:字符编码与转换 #### 1. 字符编码概念 字符编码是计算机用于存储、传输和显示文字的一套规则,它将字符映射到...

    【经验总结】解决 BurpSuite Pro v2020.1 版本中文乱码问题

    之前在我的公众号分享了 BurpSuite Pro v2020.1 版本,但是在使用过程中发现总是会有中文乱码的情况出现。 后来使用 Lucida 字体,乱码的情况得到了缓解,但是有些网页依旧会出现乱码的情况,直到后来才意识到问题...

    JSP中文乱码问题解决总结

    在IT行业中,尤其是在Web开发领域,JSP(JavaServer Pages)是常见的动态网页技术,而中文乱码问题一直是开发者们经常遇到的困扰。本篇文章将深入探讨JSP中文乱码问题的原因、解决策略以及预防措施。 一、乱码产生...

    securecrt中文乱码解决

    ### SecureCRT中文乱码解决方案 SecureCRT是一款非常流行的终端仿真软件,被广泛应用于远程服务器管理。在使用过程中,用户可能会遇到中文显示乱码的问题。本文将详细介绍如何解决SecureCRT中的中文乱码问题。 ###...

    VSCode中文乱码解决方案总结(全)

    初学python,深受中文乱码之害。总结了自己遇到的所有的中文乱码解决方法。写的简略,但是好使。对乱码原因做了解释,其实还是对编码不够懂,如果你懂了原理,就能自己解决了。我的环境是VSCode + Anaconda2

    Drozer中文乱码解决办法.docx

    Drozer 中文乱码解决办法 Drozer 是一款功能强大的 Android 渗透测试工具,但是在使用时,可能会遇到中文乱码的问题。今天,我们将探讨 Drozer 中文乱码解决办法。 一、问题描述 在使用 Drozer 时,可能会遇到...

    LINUX SSH显示中文乱码解决

    ### Linux SSH 显示中文乱码解决方案 在日常工作中,我们经常需要通过SSH远程登录到Linux系统来进行各种管理和操作。然而,一个常见的问题是当我们在Windows环境下使用SSH客户端(如PuTTY等)连接到Linux服务器时,...

Global site tag (gtag.js) - Google Analytics