乱码的根本原因是字节和字符的问题(转)

简介: 1,为什么会出现乱码      乱码的根本原因是字节和字符的问题。      我们在大学学习c的时候,老师就有介绍字符和字节。      字节由8个bit位表示,最早的编码是ASCII码,ASCII码是单字节的编码字符。

1,为什么会出现乱码

     乱码的根本原因是字节和字符的问题。

     我们在大学学习c的时候,老师就有介绍字符和字节。

     字节由8个bit位表示,最早的编码是ASCII码,ASCII码是单字节的编码字符。因为单字节8个bit位对于中文字符和其他国家的字符来说根本不够用,需要更多的bit位来表示字符。我们现在常见的编码有GBK,BIG5,GB2312,UTF-8,通过编码映射表可以确定bit位和字符之间的映射关系。

    一个应用从服务端把需要展现的文字换成一段字节流传输给浏览器,浏览器把字节流组装字符展现的过程一般是这样(应用的编码是GBK):

    服务端:String text->getBytes("GBK")->byte[] bytes

    浏览端:byte[] bytes->new String("bytes","GBK") ->String text

   如果字节流处理的转换过程使用编码不一致就会出现乱码问题。

2,常见的乱码现象

    a,提交表单的时候出现乱码(页面编码和服务端编码不一致)

      页面是jsp的时候,会经常出现的问题,这个比较容易发现和修改,只要改下jsp文件的头就可以了。

      <%@ page contentType="text/html;charset=GB2312" language="java"  %>

    b,系统之间接口调用出现乱码(如果两个应用的编码格式不一致,get和post方式都是会出现乱码问题的)

       今天遇到一个问题,系统A调用我们的http接口他们提交过来的数据是乱码,主要是因为两个系统的编码格式不一致。我们的应用是GBK,对方的是UTF-8。

       解决方法是:

           需要他们重新指定下http request的编码格式。

   c,和前端交互的时候容易出现乱码(同一个应用get方式)

       页面脚本传种中文到后台的时候会出现乱码,而且中文编码是不同的浏览器有各自的实现,后端想用 new String(“乱码”.getBytes(“GBK”),”UTF-8”)这种方式  

       去还原字符,最后得到是问号。

        前端来说最简单的解决方式是用js对页面上传输到后台的中文进行encodeURI编码,传到服务端如果是进行decode。

      (tomcat默认会先进行一次decode,所有有时候js会对中文进行2次编码)

       另外一种get方式乱码的解决方式是修改容器的encodingURI来实现。

       jboss : 修改 /server/default/deploy/jbossweb.sar/server.xml              

<Connector port= "6666"  address= "${jboss.bind.address}"
   maxThreads= "150"  minSpareThreads= "25"  maxSpareThreads= "75"
   enableLookups= "false"  redirectPort= "8443"  acceptCount= "100"
   connectionTimeout= "20000"  disableUploadTimeout= "true"  <span style= "color: #ff0000;" >URIEncoding= "GBK" </span>/>

   tomcat:/conf/server.xml

<Connector connectionTimeout= "20000"  port= "8080"  protocol= "HTTP/1.1"
     redirectPort= "8443"
     URIEncoding= "UTF-8"  />
 

  

 

 

                 

 

       

    https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

http://www.cnblogs.com/iusmile/archive/2012/06/01/2531262.html

相关文章
|
1月前
|
存储 数据库 Python
怎么解决字符乱码的问题
怎么解决字符乱码的问题
24 0
2 字节的 UTF-8 序列的字节 2 无效 解决方法
2 字节的 UTF-8 序列的字节 2 无效 解决方法: 用记事本打开xml文件,另存为 编码 选择 UTF-8,保存替换掉之前的文件,解决问题博客内容仅代表个人观点,如发现阐述有误,麻烦指正,谢谢!
4044 0
|
10月前
1. 实现含有中文字符的字符串逆转,如: “我是小萌新” 转换成“新萌小是我”(指针项目练习1)
1. 实现含有中文字符的字符串逆转,如: “我是小萌新” 转换成“新萌小是我”(指针项目练习1)
类似%-30的字串解码办法
类似%-30的字串解码办法
46 0
|
监控
中文字节长度引起的数据丢失
最近在写一个应用监控的项目,使用netty作为数据传输。因为刚开始写,没有使用Protobuf之类的作为编码工具,只是使用的是netty自带的LengthFieldBasedFrameDecoder作为报文解析工具,自定义编码解码类,实现数据传输。
140 0
空格在代码中变成其他字符或者乱码问题解决方法
空格在代码中变成其他字符或者乱码问题解决方法
2878 0
|
存储
字符与字节有什么区别呢?
1、计算机存储信息的最小单位,称之为位(bit),音译为比特,二进制的一个“0”或一个“1”叫一位。 2、计算机存储容量基本单位是字节(Byte),音译为拜特,8个二进制位组成1个字节。一般而言:一个标准英文字母占一个字节位置,一个标准汉字占二个字节位置。
3472 0
错误:编码GBK的不可映射字符的解决办法
最近在重新补javaSE的基础,编辑器编写完代码以后,在控制台运行代码段的时候,出现了以下的错误提示:错误:编码GBK的不可映射字符 在通过查询谷哥和度娘以后emmmm....我找到了错误原因以及解决办法: 错误原因:在控制台编译java源文件时 未使用UTF-8编码格式 由于java的JDK环境是国际版本的编码格式,默认格式为UNICODE的编码格式,而我们国内现在较多使用的编码格式多位UTF-8以及GB2312等编码格式,所以我们要在控制台更改java源程序的编码格式。
5440 0