[乐意黎]常见乱码产生原因及字符集

[乐意黎]常见乱码产生原因及字符集

(1)处理JSON的中文参数传到后台乱码,只需要在后台中写上:checkModel1=new String(checkModel1.getBytes("ISO-8859-1"),"UTF-8");就可以了
(2)Ajax发送中文参数到后台程序,在本地项目中,必须要处理乱码;在linux服务器上,不用处理,不会发生中文乱码的情况。
(3)Ajax中返回responseText中文乱码解决:response.setHeader("Content-Type","text/html;charset=UTF-8");
(4)在jsp页面传递参数给java后台,参数中有"+",接受到的参数会把加号换成空格" ",解决方法:
    要传递的参数为str,则在传递之前做处理
    从js中url传递参数:encodeURI(str).replace(/\+/g,'+')
    从js中url传递参数:str.replaceAll("\\+","+")
(5)Ajax  get中文乱码处理
    ①getJSON()时,参数如果有中文,中文在jsp端会乱码,在servlet端,会出异常,取不到参数;
    ②getJSON("xx.jspx",{url:urlContent},function(json){......})其中url中param参数有中文值,异常:网上的说法:因为你的参数中有特殊字符 ,把url打断了。你可以把参数编码后传过去,到后台取到参数解码回来。处理中文乱码

设置了编码方式,但是在用浏览器显示页面,还是会出现乱码,但是我们在开发工具中运行就可以显示出中文,原因在于:
你项目中设置的保存编码方式和浏览器的编码方式不一致所导致。
解决方案:
查看项目编码、查看浏览器编码。保证二者编码保持一致
检查错误时应该根据具体情况,找不到原因时按照文章开投的顺序逐级检查各级编码是否一致。

字符集

常用字符集分类

ASCII及其扩展字符集

作用:表语英语及西欧语言。

位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。

范围:ASCII从00到7F,扩展从00到FF。

ISO-8859-1字符集

作用:扩展ASCII,表示西欧、希腊语等。

位数:8位, 范围:从00到FF,兼容ASCII字符集。

GB2312字符集

作用:国家简体中文字符集,兼容ASCII。

位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。

范围:高字节从A1到F7, 低字节从A1到FE。将高字节和低字节分别加上0XA0即可得到编码。

GBK字符集

作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312。

位数:使用2个字节表示,可表示21886个字符。

范围:高字节从81到FE,低字节从40到FE。

UNICODE字符集

作用:为世界650种语言进行统一编码,兼容ISO-8859-1。

位数:UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。

BIG5字符集

作用:统一繁体字编码。

位数:使用2个字节表示,表示13053个汉字。

范围:高字节从A1到F9,低字节从40到7E,A1到FE。

GB18030字符集

作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。

位数:它采用变字节表示(1 ASCII,2,4字节)。可表示27484个文字。

范围:1字节从00到7F; 2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39。

UCS字符集

作用:国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容。

位数:它有UCS-2和UCS-4两种格式,分别是2字节和4字节。

范围:目前,UCS-4只是在UCS-2前面加了0x0000。

按所表示的文字分类

语言 字符集  正式名称
英语、西欧语ASCII ISO-8859-1 MBCS 多字节
简体中文 GB2312 MBCS 多字节
繁体中文 BIG5 MBCS 多字节
简繁中文 GBK MBCS 多字节
中文、日文及朝鲜语 GB18030 MBCS 多字节
各国语言 UNICODE,UCS DBCS 宽字节

 

编码间的转换:

要求:要知道当前内容的编码格式和要转换为的编码格式:

示例:

1
2
String username = request.getParameter("username").trim();
String password = request.getParameter("password").trim();

获取到的String类型变量:username和password的编码格式为:ISO-8859-1   

如何将他们转换成UTF-8编码,不要出现乱码,代码如下:

1
2
3
4
5
String parameter = request.getParameter("username");
//获取到参数对应的二进制数
byte[] temp = parameter.getBytes("iso-8859-1");
//通过对应的二进制数 手动编码成utf-8的字符串
String param = new String(temp, "utf-8");

 原理:

    相同的内容在计算机中的二进制编码是一样的,所以在不同编码间内容传递时,要想不出现乱码,先将该内容按其原编码转换为二进制序列。然后再将这个二进制序列按照要转换的编码进行翻译,就不会出现乱码。

 

出现的乱码形式的含义:

??????    --->    代表字符编码不匹配造成

å¸é¾       --->    代表没有该编码方式


-----------------------------------
aerchi