1. 聚能聊>
  2. 话题详情

程序员永远无法避免的话题---乱码的处理!

为什么说乱码是中国程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!如果中国的程序员不会遇到乱码,那么只有使用汉语编程。

screenshot

比如java的乱码有很多种情况:

1、关于配置Tomcat的URIEncoding

问题:程序需要发送http GET请求到服务器,请求的参数中包含了中文字符。程序中参数为UTF-8格式,且经过了UTF-8 URL编码再发送。使用的tomcat服务器,但服务器端后台程序中取到的参数的中文是乱码。

解决方法:修改Tomcat的Server.xml,在Connector标签中加上URLEncoding参数。

maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="99" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>

2、http请求乱码问题

post请求出现乱码:

解决方法:在servlet页面添加response.setCharcacterEncoding("utf-8")

get请求出现乱码:

解决方法:在后台获取字符串后对编码进行转化,如常见的编码ISO-8859-1,代码如下

String name = request.getParameter("name");
name=new String(name.getBytes("ISO-8859-1","utf-8"))          

3、Html中文乱码

问题:htmll出现乱码的主要原因是html源代码内中文字内容与html编码不同造成。网页的编码是gbk,而中文的是utf-8;

解决方法:在页面顶部......中加上以下代码

4、jsp页面出现乱码

问题:开发人员开发jsp应该拥有良好的编码意识,jsp顶部应该首先明确编码是什么?

解决方法:在页面顶部加上以下语句

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

大家来说说:
你在编程时候遇到过乱码吗?
遇到乱码你是如何解决问题的?
快分享一下您的宝贵经验!

参与话题

奖品区域 活动规则 19天后 结束

  • 奖品一

    阿里云代金券 x 5

  • 奖品二

    福禄寿淘公仔 x 1

  • 奖品三

    多功能工具箱 x 1

25个回答

0

哥特式kkkkkk 复制链接去分享

作为php程序员,也遇到过,不错还是蛮好解决的

好吧看我的 回复

有个不大的私活,接吗!

1555996239500821 回复

我接

评论
2

大河人家 复制链接去分享

你在编程时候遇到过乱码吗?

乱码是经常遇见的,毕竟编码方式不一样

遇到乱码你是如何解决问题的?

解决乱码只有一种方法,就是转码

快分享一下您的宝贵经验!

经验,都是踩过的坑,踩过之后,就不会再踩了

2

关羽大侠 复制链接去分享

你在编程时候遇到过乱码吗?
遇到过,以前一开始学jsp的时候就经常遇到,页面会乱码、tomcat也会乱码。
遇到乱码你是如何解决问题的?
我现在都采用UTF-8编码,很少再遇到这种乱码的问题。

1

小川游鱼 复制链接去分享

你在编程时候遇到过乱码吗?
答:遇到过很多次,大体可分为:前端页面中文乱码、配置文件中文乱码、后端类中文注释乱码、Linux命令提示符界面乱码、版本提交冲突乱码等。
遇到乱码你是如何解决问题的?
答:统一设置:UTF-8编码,新装编辑器先设置页面编码,注释尽量不用中文用英文,版本控制严格按流程走。

1

景凌凯 复制链接去分享

你在编程时候遇到过乱码吗?

乱码肯定会遇到的,因为编码方式的不同,编码方式与解译时采用的编码方式不一样就会出现乱码。

遇到乱码你是如何解决问题的?

我在出现乱码的时候,一般都会先查看编码和解码的格式,统一两者的编码
如果还是不能解决的话,百度就改发挥它的作用了。

快分享一下您的宝贵经验!

乱码在我们的codeing life中是不可避免的,但我们在敲代码的时候尽量考虑编码的格式,避免出现乱码。

0

1297140779246641 复制链接去分享

我刚接触编程,正在学php。也经常遇到,没人教我,只能自学

好吧看我的 回复

你多大了?

评论
1

北方的郎 复制链接去分享

你在编程时候遇到过乱码吗?
遇到过,估计程序员很少有没遇到过的。

遇到乱码你是如何解决问题的? 快分享一下您的宝贵经验!
关键是找到编码不同的切面。web,接口, service, database那个层面的问题。

1

微wx笑 复制链接去分享

你在编程时候遇到过乱码吗?
如果没遇到过乱码,那是会被怀疑是假程序员的。

遇到乱码你是如何解决问题的?
乱码的根本原因,就是编码不统一。
关键是找出那个不统一的点。

0

浮生递归 复制链接去分享

你在编程时候遇到过乱码吗?
最常见的还是iis的错误提示,没设置好,默认就是乱码。如果用的是虚拟主机就杯具了,想设都设不了。所以我还专门自己列了个乱码,以便对照错误提示内容,比如:
无法显示页面,因为发生内部服务器错误:
鏃犳硶鏄剧ず椤甸潰锛屽洜涓哄彂鐢熷唴閮ㄦ湇鍔″櫒閿欒銆�

遇到乱码你是如何解决问题的?
百度解决方法呗,这是彻底的方法。偷懒的方法,则是直接搜乱码,对照下,知道是什么意思就好了。反正出错也不多……不过也不是每次都能顺利解决的,有时候解决乱码可能会花上一整天功夫。有次我数据库里的数据存的gb2312,但是前台输出的页面则是utf-8,那个杯具啊。别忘了,不只是输入。表单提交回数据,又必须是gb2312,转来转去,头都搞大了。

0

傲雪萧霖 复制链接去分享

你在编程时候遇到过乱码吗?
程序在编程过程都会遇到乱码问题,常见
1.开发环境乱码
2.POST请求的过滤

  1. JSP ,HTML页面乱码
    4.资源文件中汉字转化UTF-8字符问题
  2. GET请求乱码
    6.Ajax请求乱码
  3. GET方法的另一个乱码问题
    8.数据库乱码

9.WebService乱码

一、避免乱码的一些注意点:
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,我就开心的笑阿,再也不用为搞这些乱码问题而烦恼
2.POST请求的过滤
这个是最基本的了,每个Servlet系统基本都会用到这个东西。不过只对POST请求有效,这个挺关键的。
使用SetCharacterEncodingFilter,这个很基础的一套过滤器,将所有来自页面的POST请求全部过滤为UTF-8编码。

  1. JSP ,HTML页面乱码
    将JSP页面全部改为charset=UTF-8,这样可以保证与后台交互的时候都是UTF-8编码,一般应用做了以上工作就基本可以应付了。

4.资源文件中汉字转化UTF-8字符问题
国际化问题,在使用资源文件的时候,由于中文在properties文件中无法被程序所识别,需要将其进行转码,我在资源文件下面制作了一个很简单的 bat文件,每次修改资源文件的时候都是在一个临时文件中修改,然后执行这个bat文件,将其转化并保存为所需要的资源文件,这个动作挺烦的,也有项目组 成员使用一些插件,但是那些东西都是直接写UTF-8码的,有时候反倒不方便,不过以后任务量巨大的时候可能会考虑使用。
实际操作起来相当麻烦,现在基本都是使用Eclipse插件,Eclipse3.1时使用PropertyEditor,但是这 个项目看上去好像停摆了,到Eclipse3.2时改用了ResourseBundle,相当的强劲的一个插件,推荐使用。

  1. 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每次都去访问服务器。

  1. GET方法的另一个乱码问题
    在项目即将交工的时候突然又出现乱码问题,发现对于超长的汉字做为参数传递仍然会出现乱码问 题,解决方法是采用java.net.URLEncoder的 Encode方法强制转码,缺点是会使JSP页面代码相当的长,但是目前还没有其他好的解决办法,我想最好的办法就是不用中文做为参数传递

8.连接MSSQL数据库有乱码,使用了很多办法,都没解决,后来重新下了个新的驱动搞定……
数据库乱码其实也很讨厌的,一般来说驱动问题比较常见,所以一旦碰到比较难缠的乱码可以先考虑下换换驱动。也有如MySQL这种,直接连接的时候就需要显示进行编码转化的,这个就要不同情况区别对待了。

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。修改环境变量的方法不到万不得已不推荐使用。

0

aoteman675 复制链接去分享

1、你在编程时候遇到过乱码吗?
只要用了中文,都会遇到乱码情况。最后我就编程环境统一用UTF-8了。从http传输到servlet,再到数据库mysql,全部使用UTF-8.
如果得到不是UTF-8,也会做转换,一定要保持编码一致。在JSP中经常遇到显示乱码情况。

2、遇到乱码你是如何解决问题的?
我会用其他编码解析出来,然后再做UTF-8转换。一般乱码的编码都是GBK或者gb2312,首先要在显示层保证显示的编码一致,然后从传输层解决,request和response都要做内容编码统一,即保证每一个数据发送点和接收点的编码保持一致。

3、快分享一下您的宝贵经验!
乱码不可怕,要有耐心找到乱码的根源。写多了就习惯了编码的统一性了。一定要从数据起源到数据结束,每一个接收点和发送点编码进行二次强制转换。

0

1975122047513504 复制链接去分享

总结不错

0

1932936243049038 复制链接去分享

0

1031404509502013 复制链接去分享

哈哈

0

31094610 复制链接去分享

烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫

0

1263640290325218 复制链接去分享

恩👍

0

胡昜 复制链接去分享

如何正确的将GBK转UTF-8 ? (实际上是unicode转UTF-8)
String gbkStr = "你好哦!"; //源码文件是GBK格式,或者这个字符串是从GBK文件中读取出来的, 转换为string 变成unicode格式
//利用getBytes将unicode字符串转成UTF-8格式的字节数组
byte[] utf8Bytes = gbkStr.getBytes("UTF-8"); 
//然后用utf-8 对这个字节数组解码成新的字符串
String utf8Str = new String(utf8Bytes, "UTF-8");
简化后就是:
unicodeToUtf8 (String s) {
return new String( s.getBytes("utf-8") , "utf-8");
}
UTF-8 转GBK原理也是一样
return new String( s.getBytes("GBK") , "GBK");
 
 其实核心工作都由  getBytes(charset) 做了。
getBytes 的JDK 描述:Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.

0

1637232745009176 复制链接去分享

1111

0

寅辰 复制链接去分享

愿世界都是utf8

0

遥大人 复制链接去分享

伟大的汉子,utf-8

2
7087
浏览
0
收藏
邀请他人互动
一项针对阿里云资源和互联网应用进行监控的服务。云监控服务可用于收集获取阿里云资源的监控指标,探测互联网服务可用性...

由轻量级Agent和云端组成,集云盾威胁情报于一体,通过Agent和云端大数据的联动,为您提供网站后门查杀、通用...

全球畅游,绿色可靠,办公协同好帮手

为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...