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

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

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

时间: 2024-10-28 20:32:48

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

转 ORACLE数据库它可以存储 中文 字节或字符

一:因为ORACLE数据库它可以存储字节或字符,例如 CHAR(12 BYTE) CHAR(12 CHAR)的意义是不同的.一般来说默认是存储字节,你可以查看数据库参数NLS_LENGTH_SEMANTICS的值. 1: SQL> show parameter nls_length_semantics; 2: 3: NAME                          TYPE        VALUE 4: ------------------------- ----------- --

Java中的字节和字符

最近在看Java中的IO相关知识,发现对字节和字符的理解还不够.写篇总结记录一下. 一.字节 所谓字节(Byte),是计算机数据存储的一种计量单位.一个二进制位称为比特(bit),8个比特组成一个字节,也就是说一个字节可以用于区分256个整数(0~255).由此我们可以知道,字节本是面向计算机数据存储及传输的基本单位,后续的字符也就是以字节为单位存储的,不同编码的字符占用的字节数不同. 那么在Java中,除了存储的意义外,Java还将字节Byte作为一种基本数据类型,该数据类型在内存中占用一个字

解惑:字、位、字节、字符、字符串。

1.字 就是我们所说的文字,如汉字,占2个字节(字不是计算机处理的数据,至少不是直接处理) 2.位(bit,比特) 这才是计算机中的最小数据单位,二进制数,如 一个0或1,这样的数据就叫一位 3.字节(byte) 是一种数据类型,一般 一个字节=8位, 字节是指一小组相邻的二进制数码(位).通常是8位作为一个字节.它是构成信息的一个小单位,并作为一个整体来参加操作 (所以,尽管最小的单位是位bit,但最常用的单位是字节byte 8位) 4.字符 字符人们使用的记号,抽象意义上的一个符号. '1'

字节和字符的区别 【转】

(一)"字节"的定义字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位. (二)"字符"的定义字符是指计算机中使用的文字和符号,比如1.2.3.A.B.C.~!·#¥%---*()--+.等等. (三)"字节"与"字符"它们完全不是一个位面的概念,所以两者之间没有"区别"这个说法.不同编码里,字符和字节的对应关系不同:①ASCII码中,一个英文字母(不分大小写)

每日一学--深究字节与字符

转载自:http://www.cnblogs.com/strivers/archive/2011/01/04/1925826.html package com.suypower.chengyu.test; public class ByteTest { /** * byte 8 bits -128 - + 127 * 1 bit = 1 二进制数据 * 1 byte = 8 bit * 1 字母 = 1 byte = 8 bit(位) * 1 汉字 = 2 byte = 16 bit */ pu

字节和字符的区别

字节和字符的定义在这里我就不写了,百度上有好多大家可以参考一下. 在学Java IO的时候,涉及到字节流和字符流,我就很郁闷字节数组里存储的数据到底是什么样子的...好多次和男朋友讨论到这个概念,我还是糊里糊涂的,最后也不好意思问他了...嘿嘿嘿..自己写了个小程序测试一下,对字节和字符的理解或许有帮助: public class BAndC { public static void main(String[] args) { String data = "Hello"; byte[]

字节和字符的差别

字节和字符的定义在这里我就不写了.百度上有好多大家能够參考一下. 在学Java IO的时候,涉及到字节流和字符流,我就非常郁闷字节数组里存储的数据究竟是什么样子的. .. 好多次和男朋友讨论到这个概念.我还是糊里糊涂的.最后也不好意思问他了. .. 嘿嘿嘿..自己写了个小程序測试一下,对字节和字符的理解也许有帮助: public class BAndC { public static void main(String[] args) { String data = "Hello"; b

Java IO 转换流 字节转字符流

Java IO 转换流 字节转字符流 @author ixenos 字节流 输入字节流:---------| InputStream 所有输入字节流的基类. 抽象类.------------| FileInputStream 读取文件的输入字节流.------------| BufferedInputStream 缓冲输入字节流. 该类内部其实就是维护了一个8kb(8192b)字节数组而已. 该类出现的目的是为了提高读取文件数据的效率. 输出字节流:---------| OutputStream

C#中流,字节,字符,字符串

首先要明白它们本身是由什么组成的: 流:二进制 字节:无符号整数 字符:Unicode编码字符 字符串:多个Unicode编码字符 那么在.net下它们之间如何转化呢? 一般是遵守以下规则: 流->字节数组->字符数组->字符串 下面就来具体谈谈转化的语法: 流->字节数组 MemoryStream ms = new MemoryStream(); byte[] buffer = new byte[ms.Length]; ms.Read(buffer, 0, (int)ms.Len