探讨java乱码

很多java初学者都遇到过乱码问题,也有很多人为此苦恼,下面来总结一下。

为什么要编码?

首先计算机只会识别二进制码,但是我们平时使用的都是字符(英文,中文,其他...)。所以,这期间就涉及到了字符与字节之间的转化过程。而这个过程(字节->字符,字符->字节)就是编码和转码!

有哪些编码类型?学过计算机的应该都知道

ASCII编码:是目前计算机中用得最广泛的字符集和编码。使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。

ISO8859-1:可以表示的是西欧语言。看起来很单一为什么还在使用呢,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示。 而且在很多协议上,默认使用该编码。问题是不支持中文编码,会导致乱码。
GB2312:它是双字节编码,总的编码范围是A1~E7,其中A1~A9是符号区,总共包含682个符号;B0~F7是汉字区,包含6763个汉字。

GBK:GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。

UTF-16:UTF-16是Unicode的其中一个使用方式。Unicode是java和xml的基础。UTF-16具体定义了Unicode的转化格式,它使用定长的表示方法,既不论什么字符都可以用两个字节来表示。两个字节就是16个bit,所以叫做UTF-16。UTF-16表示字符非常方便,每两个字节表示一个字符,这就大大简化了字符串的操作,这也是java以UTF-16作为内存的字符存储格式的很重要的原因。

UTF-8:UTF-16统一采用两个字节来表示一个字符,虽然在表示上非常简单!方便!但是也有缺点。有很大一部分字符用一个字节就可以表示的,但是现在用两个字节表示,存储放大一倍!网络带宽有多利用了一倍。所以就有了UTF-8,它是一种变长的技术,每个编码区域有不同的字码长度。不同的字符可以有1~6个字节来组成。

当然还有一些其他的编码,我们在此就不再一一讲述了。

上面的后四种编码,都是可以对中文进行处理,而这四种里面推荐大家使用的gbk和utf-8,如果使用其他编码的话,很可能会出现一些其他的问题。

乱码是由什么原因引起的?

如果字符在保存时的编码格式和要显示的编码格式不一样的话,就会出现乱码问题。比如使用gbk编码,然后使用utf-8解码。平时我们在开发的时候,经常提倡开发环境编码一致。例如页面编码,数据库编码等。有些java视频教程里面讲的是不需要进行数据库编码,这样也会有问题的,所以要注意设置数据库中的编码。
Java在运行期一律以Unicode来存储字符,这样有利的支持了多语言环境。我们在开发过程中经常会用到文件读取。Java读文件的时候会用到系统默认的编码来解码文件。所以在用FileInputStream类读取文件可以指定编码读取。
JSP页面乱码通常只要在页面开始地方用下面代码指定字符集编码即可。如果还不行,那么请用下面这句话来转换 str=new String(str.getBytes("ISO-8859-1"),"页面编码方式"); 
JAVA在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化,如: 
String str=new String(str.getBytes("开发环境编码"),"ISO-8859-1");
经过网络编码后的中文,要正确显示在页面上必须要用类似于
Stirng str=new String(str.getBytes("ISO-8859-1"),"开发环境编码");这样的方式来解码

最后,为了避免不必要的java中文乱码,我们首先要从源头做起。
什么意思呢?这就是说,我们在项目开发中,首先要让我们开发环境统一编码。比如我用的开发环境是Eclipse+Tomcat6.0+mysql。Eclipse的项目属性中可以设置项目的编码,可以针对JSP页面的设置统一的编码。

希望大家看完这篇文章后就再也不会惧怕乱码问题了,其实问题不可怕,了解了其中的原理就可以解决了。

文章转发自网络

时间: 2024-10-07 08:54:00

探讨java乱码的相关文章

Mac 下 Terminal 中 Java乱码的解决方法

在 .bash_profile 中增加一行 export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 就可以了. Mac 下 Terminal 中 Java乱码的解决方法,布布扣,bubuko.com

Java乱码总结

1. http请求是以ISO-8859-1的编码来传送url的 如果页面的content-type为utf-8,那么在发送请求时,会将字符转成utf-8后进行传送 如: 中 的UTF-8编码为:E4 B8 AD在请求时为%E4%B8%AD字节之间是%分隔 那么服务器收到这段字节流后,必须将它转成相应的字符,平时所使用的request.getParameter("name")直接得到了字符串, 那么从字节流到字符流这个过程系统己经帮助我们完成了(乱码的产生由此开始) new String

java 乱码问题解决方案

java  乱码问题解决方案 一.tomcat: <Connector         port="8080"         maxThreads="150"         minSpareThreads="25" maxSpareThreads="75"         enableLookups="false"         redirectPort="8443"    

java乱码解决之道(九)—–总结

乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到这个令人讨厌的问题,虽然是小问题但又不得不解决. 在这个系列博文中LZ并没有阐述归纳乱码的方法,出现乱码的原因各式各样但根本原因就是编码转换过程中的格式不一样,所以我们只需要了解了java在运行过程中是如何来完成编码和解码的,乱码也许就真不是什么问题了. 在前面三篇博客中LZ说明了各种编码的来由.编

页面与后台传递中文乱码问题(java乱码)

1.前台中文传递到后台乱码. 前台不须要处理, 系统一般都会默认把中文转化为ISO-8859-1类型. 仅仅需在后台接受数据是处理 Str为前台传过来的中文字符串: String inputer = new String( Str.getBytes("ISO-8859-1") , "GB2312"); 2.前台不仅包括中文.并且包括特殊字符,假设仅仅在后台转码,比較困难.採用前台转码,那么就採用后台解码的方式处理 var theid = encodeURI(enco

java乱码解决方式

如果是jar包运行乱码: java -Dfile.encoding=UTF-8 -jar /usr/MQListener/MQListener.jar $1 & 如果是tomcat运行(Ubuntu环境下): 打开tomcat/bin/catalina.sh文件,在文件开头添加如下: JAVA_OPTS='-Dfile.encoding=UTF-8'

深入解析java乱码

1.什么是编码 ,为什么要编码 先前从没有思考这么深入的问题,认为一切理所当然,知道有一天java的乱码让我跪了,他不在听我的话,到处是乱码,这次我不打算放过它,我要收拾了它. 大家都知道,文本文件,存储在硬盘上,都是一串二进制  ,01的组合,它本身是不携带任何,哪怕一丁点,信息告诉文本编辑器 hi哥们儿,我是GBK编码,我是UTF-8编 码,我是....... 它非常简单,就是01的组合,他不知道自己是什么,所以我们只有知道他是什么然后才能正确的编辑合适用它,首先看个小例子. 这是一个文本文

初窥java乱码问题

故事起源于这周踩的一个小坑,tomcat本地调启动web时报错.错误提示说有个xml文件的编码有问题,我点进去看了看没看出啥异常,开头跟其他xml一样指定了utf-8的格式,除了是小写的,我傻乎乎地去改成了大写...然后...肯定是没解决啊!!!咳咳,果断请教同事去了,瞅一眼,扔过来一串参数-Dfile.encoding=UTF-8,让我在webserver的VM OPTION里面加上,成了. 恩,又是那个古老的梗,(咦,好了!但是这是为什么呢...)虽然从头到尾我都不懂,但是还是筛选掉一些例如

java乱码问题总结

在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码,故会出现此问题.以前我一般都是保证当前页与目标页保持一致的编码就可以解决大部分问题. 但是又在为这个问题而苦恼,原因是目标页无法设置编码(例如使用了org.glassfish.jersey的REST webservice), 后来经查了大量资料,终于解决了,我知道一定有很多朋友也会碰到这个问题,所以