Servlet中文乱码问题研究

最近在做Ajax ,就利用Servlet与jsp实验ajax。

实验开始很顺利,但是在输入中文和服务器返回中文时,出现乱码,全部都显示?????

在最开始学习jsp的时候对中文乱码不明白。借此机会写一篇博客对中文乱码与编码写下自己的理解。

 

1.编码

在计算机中,因为计算机只能表示0与1,所以英文字母与汉字都不能直接让为计算机理解。编码就是为了解决这个问题。他通过人为的规定顺序,确定一个字符唯一的一种表达。

但是,由于人们有很多种想法,所以有很多种编码形式。例如:ASCII ISO-8859-1 GB2312 utf-8等等。

2.java中的编码与解码

在java中对字符的编码最简单的形式是 String类中的getBytes(String charsetName)方法,在里面传入字符集。他将String里面的内容通过传入的字符集,编码成字节数组。这样就可以通过序列化写入到硬盘与进行网络通信。

在java中解码的一种途径是通过String类的构造方法。String(byte[] bytes,String charsetName),这个构造方法通过字符集名解码输入的字节数组。意思是通过解码字符集将byte[]—>char[]

 

3web乱码问题

在web的乱码问题,大多都是由于错误的编码与解码。所以解决乱码问题。需要从编码与解码入手。

 

比如页面

<%@ page contentType = " text/html;charset=utf-8 "   %>
<form >
姓名:<input id="name" type="text"/><br>

密码:<input id="password"  type="password" /><br>
<input id="submit"  type="submit"/>

</form>

第一行表示此页面的编码是utf-8所以中文正常显示。

并且他默认向服务器发送数据的格式也是采用utf-8编码

这样在服务器端应该获取也以utf-8解码。

但是在服务器默认情况会以iso-8859-1进行解码。所以需要手动的对它进行在编码与解码。

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

此name字符串的编码解码过程

这样中文字符串就可以正常显示了。

 

 

服务器端向客户端发送

以最简单的方式

printWriter.write(String str);

的方式写入一段字符串发送回客户端。

在这里首先要设置客户端解析的编码格式

response.setHeader("Content-Type","text/html;charset=gb2312");

这样服务器向客户端传回信息后,客户端会以GB2312的编码格式进行解码。

同样。在服务器端,服务器会默认的采用iso-8859-1的格式进行编码。所以如果没有提前对字符串进行处理。那么发回给客户端的将会是一堆??????

     byte[] bytes = str.getBytes("gb2312");

     String returnstring = new String(bytes,"ISO-8859-1");

 

Str的编码解码过程

第二部进行解码是为了应对下一步服务器的编码。

让其对byte[]数组转换的char[]进行编码就不回超出字符的表示范围。

比如:一个汉字两个字节表示,但是由ISO-8859-1编码,它会将2字节转换为1字节的字符。所以不会出现丢失字符。

这样哪怕有2个字符集同时存在。也不会出现问题。

 

这样从服务器端和客户端的通信中文就没有问题了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值