Java中文乱码问题产生原因分析

合集下载

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策随着互联网的快速发展,Java在Web项目开发中的应用越来越广泛。

但是在开发过程中,很多程序员都会遇到中文乱码的问题,这不仅影响了用户体验,也给开发者带来了不小的困扰。

本文将针对Java Web项目开发中的中文乱码问题进行分析,并提出解决方法。

一、中文乱码问题的原因1. 字符编码不一致在Java Web项目中,很多地方都会涉及到字符编码的设置,比如在数据库、页面、请求参数等地方。

如果这些地方的字符编码设置不一致,就会导致中文乱码。

2. 数据传输中的转换问题在Web项目中,数据的传输是非常常见的操作。

如果在数据传输过程中没有正确设置编码格式,就会导致中文乱码。

3. 操作系统环境问题在不同的操作系统环境下,可能会存在默认的字符编码设置不一致的问题,也会导致中文乱码。

2. 使用UTF-8编码在开发过程中,建议尽量使用UTF-8编码格式。

UTF-8是一种通用的字符编码格式,能够支持几乎所有的字符。

使用UTF-8编码可以很大程度上解决中文乱码问题。

3. 设置请求和响应的字符编码在Web项目中,可以通过设置请求和响应的字符编码来解决中文乱码问题。

在请求处理的过程中,需要设置合适的字符编码格式,以确保数据传输的正确性。

4. 使用String.getBytes和new String方法进行转换在具体的代码中,可以使用String.getBytes和new String方法进行字符编码的转换。

通过这两个方法可以将字符按照指定的编码进行转换,避免中文乱码问题。

6. 使用第三方库进行编码处理在Java中有一些第三方库可以用来处理字符编码的问题,比如Apache Commons Codec 库、Google Guava库等。

通过使用这些库,可以方便地解决中文乱码问题。

三、总结在Java Web项目开发中,中文乱码问题是一个比较常见的难题。

但是通过合理的设置和编码处理,可以很好地解决这个问题。

Unicode_JAVA开发常见中文问题解决方法汇总

Unicode_JAVA开发常见中文问题解决方法汇总

JA V A开发常见中文问题解决方法汇总在Java开发中常见的中文问题主要有以下几种:一、JSP页面显示乱码二、JSP、Servlet表单提交中文时出现乱码三、连接数据库操作乱码//原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。

1、页面编码不一致导致的乱码:对不同的WEB服务器和不同的JDK版本,处理结果可能会不一样。

注意:以UTF-8编码存储的文件被解码为ISO8859-1。

解决办法:在JSP页面中指定编码方式(GBK|GB2312|UTF-8),即在页面的第一行加上:<%@ page contentType="text/html; charset= GBK|GB2312|UTF-8"%>,就可以消除乱码了。

2、JSP中include静态HTML文件时出现乱码解决办法:在web.xml文件中加入以下配置。

<jsp-config><jsp-property-group><description> JSP example.</description><display-name>JSPConfiguration</display-name><url-pattern>*.jsp</url-pattern><el-ignored>true</el-ignored><page-encoding>GB2312</page-encoding><scripting-invalid>false</scripting-invalid><include-prelude></include-prelude><include-coda></include-coda><description> JSP example</description><display-name>JSPConfiguration</display-name><url-pattern>*.html</url-pattern><el-ignored>true</el-ignored><page-encoding>GB2312</page-encoding><scripting-invalid>false</scripting-invalid><include-prelude></include-prelude><include-coda></include-coda></jsp-property-group></jsp-config>3、表单提交中文时出现乱码(分get和post两种处理)主要是由于浏览器默认使用UTF-8编码方式来发送请求,而UTF- 8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。

java 乱码转中文 代码

java 乱码转中文 代码

java 乱码转中文代码Java是一种面向对象的编程语言,广泛应用于各种领域的软件开发中。

在Java编程中,有时会遇到乱码的问题,即输出的文本显示为一些乱码字符,无法识别。

本文将介绍如何解决Java乱码问题,实现将乱码转换为中文。

一、乱码的原因乱码问题常常是由于编码方式不一致造成的。

在Java中,字符默认使用Unicode编码,而在不同的环境中,如数据库、文件系统等,使用的编码方式可能不同。

当字符的编码方式与输出环境不一致时,就会出现乱码问题。

二、乱码转中文的解决方案1. 设置正确的字符编码在Java中,可以通过设置正确的字符编码来解决乱码问题。

常见的字符编码方式有UTF-8、GBK等,可以根据实际情况选择合适的编码方式。

例如,可以使用以下代码将输出的字符编码设置为UTF-8:```javaresponse.setCharacterEncoding("UTF-8");```2. 转换字符编码如果无法直接设置字符编码,可以通过将字符从一种编码转换为另一种编码来解决乱码问题。

Java提供了相关的API来进行字符编码的转换。

例如,可以使用以下代码将乱码字符转换为中文:```javaString str = new String(乱码字符.getBytes("ISO-8859-1"), "UTF-8");```3. 使用合适的输出流在Java中,输出流也会涉及到字符编码的问题。

如果使用不正确的输出流,同样会导致乱码问题的出现。

可以使用OutputStreamWriter来指定字符编码,例如:```javaOutputStream outputStream = response.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");writer.write("中文字符");writer.flush();writer.close();```三、乱码问题的实际案例在实际的软件开发中,乱码问题经常出现在与数据库交互的过程中。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策中文乱码问题是在Java Web项目开发中常见的一个问题,它会导致页面显示、数据库存储和数据传输等方面的中文字符出现乱码现象。

本文将介绍中文乱码问题的原因和解决方案。

一、中文乱码问题的原因1. 字符编码不一致:在Java Web项目开发中,中文字符编码常使用的是UTF-8编码,但有时候程序读取和处理中文字符时使用了其他的编码方式,如ISO-8859-1,导致字符编码不一致从而出现乱码问题。

2. 数据库字符集不一致:数据库的字符集设置错误,与Java程序读取和处理中文字符的编码不一致,导致数据存储和读取时出现乱码。

3. 数据库连接设置错误:在操作数据库时,未正确设置数据库连接的字符集,导致数据库存储和读取时出现乱码。

4. 网络传输问题:在数据传输过程中,可能由于网络环境或传输方式等原因导致中文字符乱码。

二、中文乱码问题的解决方案1. 设置响应和请求的字符编码:在Java Web项目中,可以通过设置响应和请求的字符编码来解决中文乱码问题。

在Servlet的doGet或doPost方法中,在读取和输出中文字符之前,使用request.setCharacterEncoding("UTF-8")来设置请求的字符编码,使用response.setContentType("text/html;charset=UTF-8")来设置响应的字符编码。

2. 设置数据库字符集:在数据库创建表或字段时,应设置正确的字符集,通常使用UTF-8字符集来存储中文字符。

在数据库连接时,设置连接的字符集,例如在连接MySQL 数据库时可以在URL中添加参数"?useUnicode=true&characterEncoding=UTF-8"来指定连接的字符集。

3. 使用正确的编码方式读取和处理中文字符:在Java程序中,读取和处理中文字符时应使用正确的编码方式,通常使用UTF-8编码。

java中文字符乱码问题汇总

java中文字符乱码问题汇总

1. 开发环境乱码 -- eclipse或ant编译乱码将java系统默认的字符集cp1253 改成GBK 修改控制面板--区域与语言否则在用ant运行java程序的时候会出现编码的错误原因是java 在运行时会调用系统的默认配置文件System.getProperties();其中有个file.encoding 的属性决定编码集,如果是英文版的操作系统则file.encoding=CP1253所以ant 运行中文程序会乱码如果不想修改系统默认字符集的话,可以再ant java target中加入下面语句<javac srcdir="${project.src}"destdir="${project.output.build}"debug="on" encoding="UTF-8"deprecation="on"listfiles="on"includeAntRuntime="no"><compilerarg value="-Xlint:all"/><classpath refid="project.classpath"/><classpath refid="tomcat.classpath"/></javac><java classpathref="project.classpath" classname="com.mose.ParserEnglish" fork="true" failonerror="true"> <sysproperty key="file.encoding" value="UTF-8"/><arg value="-h"/></java>2. web开发乱码2.1 解决响应中的乱码何为响应中的乱码?把页面中的“username”改成“用户名”你就知道了。

Java编程中中文问题的产生及其解决方案

Java编程中中文问题的产生及其解决方案

Java 编程中中文问题的产生及其解决方案刘冰(四川达州职业技术学院信息工程系,达州635001)关键词:编码;解码;乱码;Unicode ;JVM ;GBK收稿日期:2010-02-04修稿日期:2010-03-01作者简介:刘冰(1970-),男,四川达县人,讲师,本科,研究方向为计算机软件技术在深入分析Java 程序设计中Java 编译器对Java 源文件和JVM 对class 文件的编码/解码过程的基础上,分析Java 编程中中文问题产生的根本原因,同时给出常见的Java 程序在解决中文乱码方面的建议解决方案。

引言在进行中文环境的Java 应用的开发当中,由于Java 技术本身的缺陷,稍有不慎就会碰到在例如运行Java 程序、程序移植或者Java 程序与其他媒介进行含有中文字符信息的交互等方面出现中文乱码的情况,其主要表现在中文字符串无法正确显示。

由于环境的不同,其表现情况也不尽相同,例如:Web 应用中的JSP 文件中的中文字符无法正确显示,出现类似于拉丁字母的乱码;在通过JSP 文件传输的中文参数无法正确显示,显示为“?”;在将中文数据存入数据库之后,再读出时显示为“?”,等等。

这些情况随着环境的不同而变化,相同的程序在不同的环境下有时也会出现这些问题。

1问题的产生众所周知,现在市场上许多的软件内部均是采用Unicode 格式的编码,而本地系统默认支持的却可能是其他的编码格式(例如Windows 中文系统是GBK ,而Linux 系统通常支持ISO8859-l ),这就使得它在运行时需要进行二者间的转换,或者以Unicode 为中介实现两个不同本地字符集的转换工作。

Java 语言内部使用的是Unicode 编码格式,在中文操作系统(例如Windows 系统)的背境下,要想使得Java 程序里出现的中文字符能够正确显示出来,就需要保证输入和输出的编码格式一致,即在“Java 源代码—Java 字节码—虚拟机(JVM )—操作系统—显示设备”中的每一步都必须正确地处理中文的编码。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策在Java Web项目开发中,遇到中文乱码问题是比较常见的。

中文乱码问题的根本原因是Java中使用的是Unicode编码,而在HTTP传输过程中使用的是ISO-8859-1编码,这两种编码不兼容,导致中文字符无法正确显示。

中文乱码问题通常会出现在以下几个方面:1. 数据库存储:如果数据库的字段类型是varchar而不是utf8类型,就无法正确存储中文字符,导致乱码问题。

解决办法是将数据库的字段类型修改为utf8。

2. 请求参数传递:如果浏览器向服务器发送的请求参数中包含中文字符,而服务器没有正确解析编码,就会导致中文字符乱码。

解决办法是在服务器端对请求参数进行编码转换,通常使用的是UTF-8编码。

3. 响应结果显示:如果服务器向浏览器返回的响应结果中包含中文字符,而没有正确设置响应头的编码,浏览器无法正确解析中文字符,就会显示乱码。

解决办法是在服务器端设置响应头的Content-Type为text/html;charset=UTF-8。

针对中文乱码问题,我们可以采取以下对策:1. 统一字符编码:在整个项目中都使用UTF-8编码,包括数据库、服务器、浏览器等各个环节,确保数据的正确传输和显示。

2. 在项目中添加字符编码过滤器:通过在web.xml文件中配置字符编码过滤器,可以对请求和响应的字符编码进行统一处理,确保中文字符能够正确传输和显示。

5. 在文件上传和下载时进行编码转换:在上传和下载文件时,对文件名进行编码转换,通常使用的是URL编码,确保文件名中的中文字符能够正确传输和显示。

遇到中文乱码问题时,需要在不同的环节进行编码转换和设置,确保中文字符能够正确传输和显示。

通过统一字符编码、设置响应头的字符编码、对请求参数进行编码转换等对策,可以有效解决中文乱码问题,提高项目的可用性和用户体验。

JavaWeb的各种中文乱码分析与解决

JavaWeb的各种中文乱码分析与解决

JavaWeb的各种中文乱码分析与解决一、Servlet输出乱码1. 用servlet.getOutStream字节流输出中文,假设要输出的是String str ="ooxx是中国的,无耻才是日本的"。

1.1 若是本地服务器与本地客户端这种就不用说了,直接可以out.write(str.getBytes())可以输出没有问题。

因为服务器中用str.getBytes()是采用默认本地的编码,比如GBK。

而浏览器也解析时也用本地默认编码,两者是统一的,所以没有问题。

1.1 若服务器输出时用了, out.write(str.getBytes("utf-8"))。

而本地默认编码是GBK时(比例在中国),那么用浏览器打开时就会乱码。

因为服务器发送过来的是utf-8的1010数据,而客户端浏览器用了gbk来解码,两者编码不统一,肯定是乱码。

当然,你也可以自己将客户端浏览器的编码手工调用下(IE菜单是:查询View->编码encoding->utf-8),但是这种操作很烂,最好由服务器输出响应头告诉,浏览器用哪种编码来解码。

所以要在服务器的servlet中,增加response.setHeader("content-type","text/html;charset=utf-8"),当然也可直接用简单的response.setContentType("text/hmtl;charset=utf-8")。

两种的操作是一样一样的。

2. 用servlet.getWirter字符流输出中文,假设要输出的是String str ="ooxx是中国的,无耻才是日本的"。

2.1 若写成out.print(str)输出时,客户端浏览器显示的将全是多个的字符,代表在编码表中肯定就找不到相应的字符来显示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java中文乱码问题产生原因分析在计算机中,只有二进制的数据,不管数据是在内存中,还是在外部存储设备上。

对于我们所看到的字符,也是以二进制数据的形式存在的。

不同字符对应二进制数的规则,就是字符的编码。

字符编码的集合称为字符集。

17.1.1 常用字符集在早期的计算机系统中,使用的字符非常少,这些字符包括26个英文字母、数字符号和一些常用符号(包括控制符号),对这些字符进行编码,用1个字节就足够了(1个字节可以表示28=256种字符)。

然而实际上,表示这些字符,只使用了1个字节的7位,这就是ASCII编码。

1.ASCIIASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。

每一个ASCII码与一个8位(bit)二进制数对应。

其最高位是0,相应的十进制数是0~127。

例如,数字字符“0”的编码用十进制数表示就是48。

另有128个扩展的ASCII码,最高位都是1,由一些图形和画线符号组成。

ASCII是现今最通用的单字节编码系统。

ASCII用一个字节来表示字符,最多能够表示256种字符。

随着计算机的普及,许多国家都将本地的语言符号引入到计算机中,扩展了计算机中字符的范围,于是就出现了各种不同的字符集。

2.ISO8859-1因为ASCII码中缺少£、ü和许多书写其他语言所需的字符,为此,可以通过指定128以后的字符来扩展ASCII码。

国际标准组织(ISO)定义了几个不同的字符集,它们是在ASCII码基础上增加了其他语言和地区需要的字符。

其中最常用的是ISO8859-1,通常叫做Latin-1。

Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中0~127的字符与ASCII码相同。

ISO 8859另外定义了14个适用于不同文字的字符集(8859-2到8859-15)。

这些字符集共享0~127的ASCII码,只是每个字符集都包含了128~255的其他字符。

3.GB2312和GBKGB2312是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》,标准号为GB2312-80,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆和新加坡,简称国标码。

因为中文字符数量较多,所以采用两个字节来表示一个字符,分别称为高位和低位。

为了和ASCII码有所区别,中文字符的每一个字节的最高位都用1来表示。

GB2312字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,也是最基本的中文字符集。

它包含了大部分常用的一、二级汉字和9区的符号,其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe,汉字从0xb0a1开始,结束于0xf 7fe。

为了对更多的字符和符号进行编码,由前电子部科技质量司和国家技术监督局标准化司于1995年12月颁布了GBK(K是“扩展”的汉语拼音第一个字母)编码规范,在新的编码系统里,除了完全兼容GB2312外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。

它也是现阶段Windows和其他一些中文操作系统的默认字符集,但并不是所有的国际化软件都支持该字符集。

不过要注意的是GBK不是国家标准,它只是规范。

GBK字符集包含了20 902个汉字,其编码范围是0x8140-0xfefe。

每个国家(或区域)都规定了计算机信息交换用的字符编码集,这就造成了交流上的困难。

想像一下,你发送一封中文邮件给一位远在西班牙的朋友,当邮件通过网络发送出去的时候,你所书写的中文字符会按照本地的字符集GBK转换为二进制编码数据,然后发送出去。

当你的朋友接收到邮件(二进制数据)后,查看信件时,会按照他所用系统的字符集,将二进制编码数据解码为字符,然而由于两种字符集之间编码的规则不同,导致转换出现乱码。

这是因为,在不同的字符集之间,同样的数字可能对应了不同的符号,也可能在另一种字符集中,该数字没有对应符号。

为了解决上述问题,统一全世界的字符编码,由Unicode协会1制定并发布了Unicode编码。

4.UnicodeUnicode(统一的字符编码标准集)使用0~65535的双字节无符号数对每一个字符进行编码。

它不仅包含来自英语和其他西欧国家字母表中的常见字母和符号,也包含来自古斯拉夫语、希腊语、希伯来语、阿拉伯语和梵语的字母表。

另外还包含汉语和日语的象形汉字和韩国的Hangul音节表。

目前已经定义了40000多个不同的Unicode字符,剩余25000个空缺留给将来扩展使用。

其中大约20 1Unicode协会是由IBM、微软、Adobe、SUN、加州大学伯克利分校等公司和组织所组成的非营利性组织。

000个字符用于汉字,另外11000左右的字符用于韩语音节。

Unicode中0~255的字符与ISO8859-1中的一致。

Unicode编码对于英文字符采取前面加“0”字节的策略实现等长兼容。

如“a”的ASCII码为0x61,Unicode码就为0x00,0x61。

5.UTF-8使用Unicode编码,一个英文字符要占用两个字节,在Internet上,大多数的信息都是用英文来表示的,如果都采用Unicode编码,将会使数据量增加一倍。

为了减少存储和传输英文字符数据的数据量,可以使用UTF-8编码。

UTF-8全称是Eight-bit UCS Transformation Format(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。

对于常用的字符,即0~127的ASCII字符,UTF-8用一个字节来表示,这意味着只包含7位ASCII字符的字符数据在ASCII和UTF-8两种编码方式下是一样的。

如果字符对应的Unicode码是0x0000,或在0x0080与0x007f之间,对应的UTF-8编码是两个字节,如果字符对应的Unicode码在0x0800与0xffff之间,对应的UTF-8编码是三个字节。

因为中文字符的Unicode编码在0x0800与0xffff之间,所以数据如果是中文,采用UTF-8编码数据量会增加50%。

Unicode与UTF-8转换的规则简述如下:(1)如果Unicode编码的16位二进制数的前9位是0,则UTF-8编码用1个字节来表示,这个字节的首位是“0”,剩下的7位与原二进制数据的后7位相同。

例如:Unicode编码:\u0061 = 00000000 01100001UTF-8编码:01100001 = 0x61(2)如果Unicode编码的16位二进制数的头5位是0,则UTF-8编码用2个字节来表示,首字节以“110”开头,后面的5位与原二进制数据除去前5个零后的最高5位相同;第二个字节以“10”开头,后面的6位与原二进制数据中的低6位相同。

例如:Unicode编码:\u00A9 = 00000000 10101001UTF-8编码:11000010 10101001 = 0xC2 0xA9(3)如果不符合上述两个规则,则用三个字节表示。

第一个字节以“1110”开头,后四位为原二进制数据的高四位;第二个字节以“10”开头,后六位为原二进制数据中间的六位;第三个字节以“10”开头,后六位为原二进制数据的低六位。

例如:Unicode编码:\u4E2D = 01001110 00101101UTF-8编码:11100100 10111000 10101101 = 0xE4 0xB8 0xAD17.1.2 对乱码产生过程的分析为了让使用Java语言编写的程序能在各种语言的平台下运行,Java在其内部使用Unicode字符集来表示字符,这样就存在Unicode字符集和本地字符集进行转换的过程。

当在Java中读取字符数据的时候,需要将本地字符集编码的数据转换为Unicode编码,而在输出字符数据的时候,则需要将Unicode编码转换为本地字符集编码。

例如,在中文系统下,从控制台读取一个字符“中”,实际上读取的是“中”的GBK编码0xD6D0,在Java语言中要将GBK编码转换为Unicode编码0x4E2D,此时,在内存中,字符“中”对应的数值就是0x4E2D,当我们向控制台输出字符时,Java语言将Unicode编码再转换为GBK编码,输出到控制台,中文系统再根据GBK字符集画出相应的字符。

从上述过程来看,读取和写入的过程是可逆的,那么理应不会出现中文乱码问题。

然而,实际应用的情形,比上述过程要复杂得多。

在Web应用中,通常都包括了浏览器、Web服务器、Web应用程序和数据库等部分,每一部分都有可能使用不同的字符集,从而导致字符数据在各种不同的字符集之间转换时,出现乱码的问题。

在Java语言中,不同字符集编码的转换,都是通过Unicode编码作为中介来完成的。

例如,GBK编码的字符“中”要转换为ISO-8859-1(同ISO8859-1)编码,其过程如下:(1)因为在Java中的字符,都是用Unicode来表示的,所以GBK编码的字符“中”要转换为Unicode 表示:0xD6D0->0x4E2D。

(2)将字符“中”的Unicode编码转换为ISO-8859-1编码,因为Unicode编码0x4E2D在ISO-8859-1中没有对应的编码,于是得到0x3f,也就是字符“?”。

下面的代码演示了这一过程://GBK编码的字符“中”转换为Unicode编码表示String str="中";//将字符“中”的Unicode编码转换为ISO-8859-1编码byte[] b=str.getBytes("ISO-8859-1");for(int i=0;i<b.length;i++){//输出转换后的二进制代码。

System.out.print(b[i]);}当从Unicode编码向某个字符集转换时,如果在该字符集中没有对应的编码,则得到0x3f(即问号字符?)。

这就是为什么有时候我们输入的是中文,在输出时却变成了问号。

从其他字符集向Unicode编码转换时,如果这个二进制数在该字符集中没有标识任何的字符,则得到的结果是0xfffd。

例如一个GBK的编码值0x8140,从GB2312向Unicode转换,然而由于0x8140不在GB2312字符集的编码范围(0xa1a1-0xfefe),当然也就没有对应任何的字符,所以转换后会得到0xfffd。

下面的代码演示了这一过程。

//构造一个二进制数据。

byte[] buf={(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1};//将二进制数据按照GB2312向Unicode编码转换。

相关文档
最新文档