`
yanpingli
  • 浏览: 5653 次
  • 性别: Icon_minigender_2
  • 来自: 重庆
最近访客 更多访客>>
社区版块
存档分类
最新评论

【转】中文乱码问题整理

 
阅读更多
    乱码对于使用非英语文字程序员基本上是一直缠绕在身边的麻烦事,这个谁也避免不了。下面是我解决乱码时候的一点小经验。欢迎指正
  
  一、避免乱码的一些注意点:
  1.尽量使用统一的编码,如果你是重头开发一个系统,特别是Java开发的,推荐从页面到数据库再到配置文件都使用UTF-8进行编码,安全第一。
  2.SetCharacterEncodingFilter的使用,这个东西不是万能的,但是没有它就会很麻烦,如果是基于Servlet开发的东西,能用的就给它用上,省心。不过有一个注意的地方,这个Filter只是对POST请求有效,GET一律忽略,不信你可以debug一下,看看它怎么做的,至于为什么不过滤get请求,好象是它对GET请求是无能为力的。
  3.就如上面所说,GET请求有问题,尽量使用POST请求,这个也是Web开发的一个基本要领:
  Web Health Warning:Put All Destructive Actions Behind a POST method(from Agile Web Development with Rails)
  有点扯远了,不过少用GET,是会有回报滴。
  4.JavaScript和Ajax乱码的避免,注意JavaScript默认是ISO8859的编码,避免JS/AJAX乱码和GET一样,不要在URL里面使用中文,实在避免不了,就只能在生成链接的时候转码,绝对不能想当然的认为SetCharacterEncodingFilter会帮你做什么事情。
  5.尽早统一开发环境,早点模拟真实环境测试,这个好像也有跑题的嫌疑,但凡软件开发都是这么干的,但仍然值得注意。我这出现过一次状况,程序是在Win下编译的,拿去Linux上测试没问题,等实际部署的时候代码是在Linux下编译,结果乱码,秋后算帐总觉得有点晚。
  
  二、乱码发生的情况和应对措施
  1.开发环境乱码
   由于Java默认使用UTF-8编码,而且网上很多人都建议Struts开发的时候应尽量选用UTF-8做为默认编码,而非GBK。IDE使 用Eclipse,在第一次使用Eclipse的时候应将default text editor改为UTF-8编码,免得日后后悔再改就惨了,我本次开发的时候就忽视了这一点,刚开始没注意,结果到快交工时乱码问题无法解决,导致将所有 的文件全部修改一遍,呜……
   自打使用Ubuntu,我就开心的笑阿,再也不用为搞这些乱码问题而烦恼^^(Ubuntu公益广告)
  2.POST请求的过滤
   这个是最基本的了,每个Servlet系统基本都会用到这个东西。不过只对POST请求有效,这个挺关键的。
   使用SetCharacterEncodingFilter,这个很基础的一套过滤器,将所有来自页面的POST请求全部过滤为UTF-8编码。
  3. JSP ,HTML页面乱码
   将JSP页面全部改为charset=UTF-8,这样可以保证与后台交互的时候都是UTF-8编码,一般应用做了以上工作就基本可以应付了。
  4.资源文件中汉字转化UTF-8字符问题
   国际化问题,在使用资源文件的时候,由于中文在properties文件中无法被程序所识别,需要将其进行转码,我在资源文件下面制作了一个很简单的 bat文件,每次修改资源文件的时候都是在一个临时文件中修改,然后执行这个bat文件,将其转化并保存为所需要的资源文件,这个动作挺烦的,也有项目组 成员使用一些插件,但是那些东西都是直接写UTF-8码的,有时候反倒不方便,不过以后任务量巨大的时候可能会考虑使用。Bat文件内容: set path=%path%;%JAVA_HOME%/bin/,native2ascii -encoding UTF-8 ApplicationResources_bk.txt > ApplicationResources_zh.properties
  
   PS:上面的方法好老了,实际操作起来相当麻烦,现在基本都是使用Eclipse插件,Eclipse3.1时使用PropertyEditor,但是这 个项目看上去好像停摆了,到Eclipse3.2时改用了ResourseBundle,相当的强劲的一个插件,推荐使用。
  5. GET请求乱码
   如果在本项目中采用了get方式提交请求并附加参数,结果导致编码乱码,原因是Tomcat默认请求编码是ISO8859,需要在Tomcat的配置文件 server.xml添加一个参数,URIEncoding=”UTF-8”,这样请求中附件的参数就会以UTF-8来进行编码。
  6.Ajax请求乱码
   使用Ajax,JS也是默认使用ISO8859编码,所以在进行请求时遇到中文参数需要进行编码,如:var url = "GetSelectListAction.do?querydata=subTrade" + "&queryId=" + encodeURI(obj.value) + "&r=" + Math.random();
   这里有两个地方需要注意:第一个地方是encodeURI(),方法,可以将参数进行转码,默认是转化为UTF-8,如果需要转为其他码制,需要在方法中添加第二个参数。

   第二个地方是Math.random(),由于Ajax有缓存机制,在接受请求的时候第一时间先判断该请求的地址是否被访问过,如果被访问过则 直接使用缓存中的内容返回,这个东西很讨厌,客户在访问过一次出错后以后每次出现的都是这个错误,所以在请求中给其增加一个时间戳,只要可以随机生成一个 不同的字串就可以,保证Ajax每次都去访问服务器。
  7. GET方法的另一个乱码问题
   在项目即将交工的时候突然又出现乱码问题,发现对于超长的汉字做为参数传递仍然会出现乱码问题,解决方法是采用java.net.URLEncoder的 Encode方法强制转码,缺点是会使JSP页面代码相当的长,但是目前还没有其他好的解决办法,我想最好的办法就是不用中文做为参数传递 :P,写法如:
  
  8.乱码仍然是偶们的心病,一直牵动着大家的心,最近一位朋友说连接MSSQL数据库有乱码,使用了很多办法,都没解决,后来重新下了个新的驱动搞定……
  数据库乱码其实也很讨厌的,一般来说驱动问题比较常见,所以一旦碰到比较难缠的乱码可以先考虑下换换驱动。也有如MySQL这种,直接连接的时候就需要显示进行编码转化的,这个就要不同情况区别对待了。
  
  //2007年11月30日添加
  9.WebService乱码,由于对WebService不怎么熟悉,使用的是Weblogic提供的WebService支持,乱码再次出现搞得手忙脚乱,而且无从下手,在自己系统上跑都没有问题,结果跑到服务器上就全乱套,又无法调试,愁人。
   反复尝试的过程就不说了,绝对比普通的Web开发麻烦的多。最终解决方法:
   A.为WebService服务也加上一个filter,WebService也是走HTTP协议的,这个东西同样有用,先得加上。
   B.修改服务器上的环境变量,LANG=zh_CN.UTF-8,改成这个是为什么我仍然说的不是很清楚,不过当时开发人员就是在Win下开发的,我在自己的Ubuntu上测试没问题,拿到Redhat服务器上就不行,因为服务器上默认的是LANG=en_US.UTF-8,这个明显是不支持汉字的。
   经过这两个步骤WebService乱码总算得到抑制,它主要的麻烦在于所有与协议有关的东西都被Weblogic包办,里面做什么事情我们不好控制,所以只能采取这种比较笨的办法,虽然解燃煤之急但无法寻根溯源的搞定它,说不定哪天又会出来搞鬼。果然又一次出现乱码问题,经过比较环境变量发现服务器上的LC_CTYPE被修改了,所以强制改成LC_CTYPE=zh_CN。修改环境变量的方法不到万不得已不推荐使用。

#日志日期:2009-11-27 星期五(Friday) 晴 复制链接 举报

弘扬正气,明辨是非,人人当有公民意识
分享到:
评论

相关推荐

    C#的ini文件操作,解决网上未解决的Get或Set中文乱码问题

    本资源我重新整理,用unicode完美解决中文乱码问题。用法: 1.声明实例 IniFile iniFile = new IniFile(HttpContext.Current.Server.MapPath("~/App_Data/LocalData.ini")); 2.存数据 iniFile.WriteValue...

    MySQL数据库系统中文乱码问题及解决方案.pdf

    MySQL数据库系统中文乱码问题及解决方案 MySQL数据库系统中文乱码问题是指在使用MySQL数据库系统时,中文字符在存储、传输和显示过程中出现乱码的问题。这种问题的出现是由于字符集和编码方式的不兼容所致。 在...

    editplus插件htmlFormatter.js解决中文乱码问题

    首先,我们了解下中文乱码问题的背景。在处理包含中文字符的HTML文件时,如果没有正确设置编码或者在格式化过程中编码转换不当,就可能出现中文乱码现象。这不仅影响代码的可读性,也可能导致程序运行错误。因此,...

    java zip解压中文乱码问题

    网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...

    中文乱码整理

    在IT领域,中文乱码是一个常见的问题,尤其是在处理文本数据时。中文乱码是指在计算机显示或处理中文字符时出现的无法识别或者错误显示的现象。这种情况通常发生在编码、解码或者传输过程中,由于编码格式不匹配或者...

    Delphi TCPIP通信 实例 解决中文乱码问题

    敝人近期整理的客户端与服务端通信实例,数据编码约定采用UTF-8编码,解决中文乱码问题.ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的...

    Delphi TCPIP通信 实例 解决中文乱码问题 SOCKET SERVER-CLIENT

    敝人近期整理的客户端与服务端通信实例,数据编码约定采用UTF-8编码,解决中文乱码问题.ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的...

    解决jfreechart中文乱码方案整理.doc

    因此,针对JFreeChart中的中文乱码问题,本文将汇总并整理一系列有效的解决方案。 #### JFreeChart简介 JFreeChart是一款开源Java图表库,它提供了丰富的API来创建高质量的图表。JFreeChart支持多种类型的图表,...

    sourceinsight中文乱码的解决方案整理.pdf

    Source Insight 中文乱码解决方案整理 I. Source Insight 简介 Source Insight 是一款功能强大且灵活的源代码浏览和编辑工具,支持多种编程语言,包括 C、C++、Java、Python 等。它可以帮助开发者快速浏览和编辑源...

    Java连接过程中的MySQL中文乱码问题[整理].pdf

    在Java编程中,连接MySQL数据库时可能会遇到中文乱码的问题,这主要涉及到字符集的配置。MySQL数据库默认的字符集是latin1,不支持中文字符,因此需要进行相应的设置以确保中文能正确显示和存储。以下是一些关键知识...

    jsp乱码详解整理.docx

    在JSP编程中,乱码问题常常困扰开发者,尤其是在处理中文字符时。本文将深入探讨JSP中的乱码问题,包括输出中文乱码、请求参数乱码以及JSP页面显示乱码的情况,并提供相应的解决方案。 1. **解决输出中文乱码问题**...

    解决JavaWeb开发中Jsp存储读取MySQL数据中文乱码的问题[整理].pdf

    解决JavaWeb开发中Jsp存储读取MySQL数据中文乱码的问题[整理].pdf

    response与request中文乱码问题及解决方式

    前言:在Javaweb开发过程中可能会遇到乱码的问题,本文整理了几个常用的乱码解决方式一.编码基础知识1.四种常见编码ISO-8859-1单字节编码,兼容ASCII码,相当于ASCII码的扩展,无法表示中文字符,系统默认编码。GBK...

    HttpServletResponse乱码问题_动力节点Java学院整理

    然而,在使用HttpServletResponse对象时,常常会遇到中文乱码问题。本文将详细介绍HttpServletResponse对象的使用方法,并解决中文乱码问题。 一、HttpServletResponse对象的基本使用 HttpServletResponse对象是...

    LInux 乱码解决资料搜集

    本文旨在整理关于Linux系统乱码问题的相关资料,并提供一系列可行的解决方案。 #### 二、乱码成因分析 Linux系统中的乱码问题,通常由以下几种原因导致: 1. **字符编码不匹配**:Linux系统内部处理文本时默认...

    tableExport导出pdf 中文 乱码解决 简洁版

    目前在做一个项目要求导出pdf文件,但发现导出中文乱码,研究了好久终于解决,现整理好分享给大家,其实之前已经上传过,可能里面有一下多余的没删除,导致部分下载者,不能正确使用,现在我把多余的都删除了,只需要...

    mp3标签转换器_解决手机音乐名字乱码

    MP3标签转换器是一款专为解决音频文件,尤其是MP3格式的文件,其元数据(如歌曲标题、艺术家、专辑等)出现乱码问题而设计的工具。在我们的日常生活中,尤其是在手机上,我们常常会遇到音乐文件的名字显示不正确或者...

Global site tag (gtag.js) - Google Analytics