JavaWeb的各种中文乱码终极解决方法

一、Servlet输出乱码

1. 用servlet.getOutStream字节流输出中文,假设要输出的是String str ="钓鱼岛是中国的,无耻才是日本的"。

1.1 若是本地服务器与本地客户端这种就不用说了,直接可以out.write(str.getBytes())可以输出没有问题。因为服务器中用str.getBytes()是采用默认本地的编码,比如GBK。而浏览器也解析时也用本地默认编码,两者是统一的,所以没有问题。

1.1 若服务器输出时用了, out.write(str.getBytes("utf-8"))。而本地默认编码是GBK时(比例在中国),那么用浏览器打开时就会乱码。因为服务器发送过来的是utf-8的1010数据,而客户端浏览器用了gbk来解码,两者编码不统一,肯定是乱码。当然,你也可以自己将客户端浏览器的编码手工调用下(IE菜单是:查询View->编码encoding->utf-8),但是这种操作很烂,最好由服务器输出响应头告诉,浏览器用哪种编码来解码。所以要在服务器的servlet中,增加response.setHeader("content-type","text/html;charset=utf-8"),当然也可直接用简单的response.setContentType("text/hmtl;charset=utf-8")。两种的操作是一样一样的。

2. 用servlet.getWirter字符流输出中文,假设要输出的是String str ="钓鱼岛是中国的,无耻才是日本的"。

2.1 若写成out.print(str)输出时,客户端浏览器显示的将全是多个?????的字符,代表在编码表中肯定就找不到相应的字符来显示。原因是:servlet.getWriter()得到的字符输出流,默认对字符的输出是采用ISO-8859-1,而ISO-8859-1肯定是不支持中文的。所以肯定要首先要做的第一件事:是要将服务器对象输出字符能支持中文的。其次服务器向客户端写回的响应头要告诉客户端是用了哪种编码表进行编码的。而实现这两个需求,只需要response.setContentType("text/hmtl;charset=utf-8")。就搞定了。特别注意:response.setContentType("text/html;charset=utf-8")要放在PrintOut out = response.getWriter()代码的前面,否则只是有告诉客户端用什么码表编码的功能,而服务器端还是用ISO-8859-1编码了。再特别提示下:在同一Servlet中的doGet或doPost方法中,不能既用response.getOutputStream又用response.getWriter,因为这两种response的响应输出字节流与字符流是冲突的,只能用其一。

二、Servlet文件下载,中文乱码情况。

关键是下载时响应头 content-disposition中attachment;filename=文件名。这个文件名filename不能是含有中文字符串的,要用URLEncoding编码进行编码,才能进行进行http的传输。如下代码示例:

三、Servlet的response增加addCookie,cookie中value的中文码问题解决方法。

关于cookie的原理,见http://blog.csdn.net/chenshufei2/article/details/8009992。 若想将cookie中存放中文的值,必须用Base64编码后,发给客户浏览器端进入存储。而下次客户端浏览访问是带回来的cookie中的值,是经过Base64编码的,所以需要用Base64解码即可。 Base64编码主要是解决将特殊字符进行重新编码,编码成a-b、A-B、0-9、+与/,字符52,10个数字与一个+,一个/ 共64个字符。它的原理是将原来3个字节的内容编码成4个字节。主要是取字节的6位后,在前面补00组成一个新的字节。所以这样原来的3个字节共24,被编码成4个字节32位了。

具体代码示例如下:

四、获取请求参数乱码

GET方式的乱码:

如<a href=”/demo5/servlet/RD2?name=中国”>CN</a>,直接用request.getParameter得到的字符串strCN将会乱码,这也是因为GET方式是用http的url传过来的默认用iso-8859-1编码的,所以首先得到的strCn要再用iso-8859-1编码得到原文后,再进行用utf-8(看具体页面的charset是什么utf-8或gbk)进行解码即可。new String(strCn.getBytes(“ISO-8859-1”),“UTF-8”);

这种方式操作比较麻烦的是,有一个参数要用iso-8859-1编码一次再解码一次。

POST方式的乱码:只需要request.setCharacterEncoding("UTF-8"):即可。

时间: 2024-10-26 22:01:35

JavaWeb的各种中文乱码终极解决方法的相关文章

Sublime Text 3打开txt中文乱码的解决方法

Sublime Text是一个非常强大的编辑器,可是对中文的支持并不好,在Sublime Text 2 时,可以通过命令行的方式安装编码包来解决,但Sublime Text 3不能通过这样的方式解决 在安装完Sublime Text 3后要下载一个ConvertToUTF8包放到C:\Users\用户名\AppData\Roaming\Sublime Text 3\Packages(安装目录可能不是这个,但可以在sublime中preference - browse packages打开此目录)

Visual Assist X在Windows 8.1下出现中文乱码的解决方法

这主要是输入法造成的,我的输入法中有US.中文.搜狗输入法三个输入法:通过搜狗输入法管理器把"中文"去掉,或者通过语言首选项把"中文"去掉就不会在出现乱码. 这个办法的思路来自于http://www.cnblogs.com/Coling/p/3527233.html,但他说的是把除搜狗之外的都删除,我不赞同,作为开发者,经常输入英文,且经常使用Shift,只保留搜狗,那写代码时要累死.于是尝试删除"中文",结果就搞定了. Visual Assis

提交数据的中文乱码的解决方法

使用GET方式提交数据的中文乱码的解决方法: 使用URLEncoder.encode(name,"UTF-8")进行url编码:      String path = "http://192.168.22.136:8080/web/servlet/LoginServlet?username="+URLEncoder.encode(name,"UTF-8")+"&password="+URLEncoder.encode(

SSH Secure Shell Client中文乱码的解决方法

这是SSH Secure Shell Client多年未解决的短板,要求客户端和服务器端都要'UTF-8'编码,Windows中文版的编码是非UTF-8.zh_CN.UTF-8是UTF编码的中文语言环境.Windows使用的是GB2312编码,大多数linux系统支持的是UTF-8编码,而远程登陆时使用的是本地编码,所以会出现乱码的问题:现有几种解决方案: 方案一:修改linux服务器的环境变量 使用linux,在用户根目录下有一个.bash_profile配置文件,该配置只对当前用户有效.若对

关于perl中,中文乱码的解决方法

今天在测试自己写的邮件模块的时候,发现客户端收到的邮件标题是乱码,于是学习了一下perl中对字符串处理的机制,再次记录下,也希望以后对其他朋友有所帮助 首先perl只能处理2种编码的格式,ascii码和utf-8. 那么perl首先要确定一个字符串是octets还是utf8编码,他完全是靠字符串上的utf8 flag. 在perl内部,字符串结构由两部分组成: [utf8 + 数据].如果utf8 flag是on的话, perl就会把它当成utf8字符串来处理, 如果utf8 flag为off,

C. PHP读取TXT中文乱码的解决方法

PHP读取TXT中文乱码的解决方法 2013-03-01 19:12 2203人阅读 评论(0) 收藏 举报 //$fname文件名称 if ($fname = $_FILES['nickname']['tmp_name']) { //file_get_contents() 函数把整个文件读入一个字符串中. $contents = file_get_contents($fname); //获取文件的编码方式 $encoding = mb_detect_encoding($contents, ar

30. CentOS终端命令行显示中文乱码的解决方法

安装CentOS的时候选择了中文,结果在终端不能显示中文,都是乱码,解决方法:修改/etc/sysconfig/i18n,内容为 代码如下: LANG="zh_CN.GB18030"LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en"SYSFONT="lat0-sun16" 退出重新登录即

android studio中文乱码的解决方法【转】

一. 在android的源文件中的乱码问题 Android Studio安装后发现所有的中文,不管是界面上的还是输出的log中的中文都变成小框框,具体的解决方法如下, 可以肯定是字体的问题 解决:菜单File->settings对话框,切换到Appearance标签 选择override default fonts by, 先随便选择一个中文字体(PS:小框框都是中文字 呵呵),保存,重启软件,即可. 二. Toast.makeText乱码问题,如下 文件中乱码解决了, 发现软件在工作中, To

mysql命令行以及mysql workbence查询结果中文乱码的解决方法

最近正在学习mysql,安装环境是windows server 2003 32位操作系统+mysql 5.1.47同时也安装了mysql命令行以及mysql workbench这里是test数据库create  table fortest(empno int auto_increment,empname nvarchar(20) not null,constraint pk_fortest primary key(empno))default charset=utf8;然后插入了一条数据set