java乱码的原因
- 格式:doc
- 大小:17.00 KB
- 文档页数:2
java如何解决乱码问题java如何解决乱码问题做项目经常会遇到Java中的乱码问题,那么遇到乱码问题怎么解决呢?下面店铺为大家解答一下,希望能帮到大家!分析编码与解码编码就是将字符转为字节,解码就是就是将字节转换为字符。
字节流与字符流对文件的读写操作都是通过字节流来实现的,即使JAVA中有字符流,但是其底层仍然使用的字节流。
乱码问题出现java中使用最频繁的是字符,当我们将文件读入内存并在控制台显示时(字节流--->字符流),就需要用到解码。
如果文件是UTF-8编码,而我们解码时错用成GBK(如果不指定编码,JAVA会采取系统默认编码)来解码,那么只能显示乱码。
而我们写文件时,最好指定编码(UTF-8)。
解决方案示例1将字节流转换为字符流时,我们指定编码格式。
这是我们文件也应该是gb2312编码public static String read(String filename) throws Exception { InputStream is = new FileInputStream(filename); BufferedReader in = new BufferedReader(new InputStreamReader(is, "gb2312")); //指定编码格式String s; StringBuilder sb = new StringBuilder(); while ((s = in.readLine()) != null) { sb.append(s + "n"); } in.close(); return sb.toString();} 示例2直接通过字节流读入,使用String转换为字符时,指定编码。
package com.dy.xidian;import java.io.FileInputStream;import java.io.InputStream;class BufferedInputFile { public static Stringread(String filename) throws Exception { @SuppressWarnings("resource") InputStream is = new FileInputStream(filename); byte[] b = new byte[1024]; is.read(b); return new String(b, "gb2312"); }}public class MemoryInput { public static void main(String[] args) throws Exception { String filename = "E:/html/gb2312.php"; String s = BufferedInputFile.read(filename); System.out.println(s); }} 陷阱I/O操作中有个FileReader类,这个类隐藏了字节流转为字符流的'细节,我们可以这样使用。
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项目开发中,中文乱码问题是一个比较常见的难题。
但是通过合理的设置和编码处理,可以很好地解决这个问题。
中文乱码总结:1-->响应中的乱码:单个页面中,如果出现中文(注意不是post中文也不是get中文,只是显示中文而已),而且使用的是<%@page contentType="text/html;charset=iso-8859-1"%> 此时显示的中文就是乱码,为什么呢?因为charset=iso-8859-1 是设置http的响应(response)中的编码信息,因为是中文,所以http给浏览器显示的汉字是乱码。
2-->post乱码:两个页面(或多个页面)通过form表单post传值(form的默认提交方式都是GET)时,这里与1不同,为什么呢?因为此时发送了请求有request,而1中没有request只是响应而已。
发送请求的时候,使用的编码默认的是iso-8859-1,意味着只有英文是有效字符,这个限制是因为当初指定http标准的成员都来自英语国家,所以如果使用默认的方式从请求获取数据,中文一定会全部变成乱码。
此时就要加上request.setCharacterEncoding("gbk");有了请求request.setCharacerEncoding("gbk")编码方式和http的响应(response)中的编码信息<%@pagecontentType="text/html;charset=gbk"%>两个都gbk,此时body中的(注意是body,如果是url就会有问题往下看就知道了)中文就不会显示为乱码a---乱码出现的过程是这样的,传的是汉字,发送请求的默认编码是iso-8859-1,此时把汉字按iso-8859-1转码出现问题出现??或莫名的符号,响应的时候位数都打乱了(iso-8859-1和gbk编码位数不一样),虽然<%@pagecontentType="text/html;charset=gbk"%>但还是会出现乱码。
1、最基本的乱码问题。
这个乱码问题是最简单的乱码问题。
一般新会出现。
就是页面编码不一致导致的乱码。
<%@ page language="java" pageEncoding="UTF-8"%><%@ page contentType="text/html;charset=iso8859-1"%><html><head><title>中文问题</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head></head><body>我是个好人</body></html>三个地方的编码。
第一个地方的编码格式为jsp文件的存储格式。
Ecljpse会根据这个编码格式保存文件。
并编译jsp文件,包括里面的汉字。
第二处编码为解码格式。
因为存为UTF-8的文件被解码为iso8859-1,这样如有中文肯定出乱码。
也就是必须一致。
而第二处所在的这一行,可以没有。
缺省也是使用iso8859-1的编码格式。
所以如果没有这一行的话,“我是个好人”也会出现乱码。
必须一致才可以。
第三处编码为控制浏览器的解码方式。
如果前面的解码都一致并且无误的话,这个编码格式没有关系。
有的网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。
因为页面有时候会嵌入页面,导致浏览器混淆了编码格式。
出现了乱码。
2、表单使用Post方式提交后接收到的乱码问题这个问题也是一个常见的问题。
这个乱码也是tomcat的内部编码格式iso8859-1在捣乱,也就是说post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受。
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)。
短信内容出现乱码是因为内容带有手机识别不了的字符编码。
则可能会出现部分不能正常阅读的昏乱字符。
出现次情况的存在原因:
1、客户编辑的内容正常,但个别手机型号比较老,字库不支持;尽量协商客户进行手机字库升级或更换手机;
2、客户编辑的短信中有特殊字符、使用繁体字编辑、使用特殊输入法编辑短信内容,导致手机接收不正常,这个主要是由于运营商通道不支持造成。
由于运营商通道不支持,所以暂时无法解决。
3、可能对方发的是表情符号,然后因为两个人的手机型号不同会产生这种情况。
4、故意发的古怪的符号(这种情况不多)。
5、其他情况,把手机恢复出厂设置,或带着手机咨询手机专业维修员。
6. 因为给你发信息的是另外一个运营商的号码,且字数超过你手机所能接收的数量
比如你的手机只能接收70个字(一条短信),且你是移动的号码
那么,如果有联通的给你发了超过70个字的短信,那你就会收到乱码
没关系,只要告诉经常给你发信息的人,让他一条短信只输入70个字,没完的话再加到下一条,就OK了
Msg消息内容,如果为中文则一条最多70个字,多于70个字分多条短信发送如果全为英文则一条最多为140个字符,多余于140则分多条发送。
JAVA中⽂字符乱码解决详解⾸先要了解JAVA处理字符的原理。
JAVA使⽤UNICODE来存储字符数据,处理字符时通常有三个步骤:– 按指定的字符编码形式,从源输⼊流中读取字符数据– 以UNICODE编码形式将字符数据存储在内存中– 按指定的字符编码形式,将字符数据编码并写⼊⽬的输出流中。
所以JAVA处理字符时总是经过了两次编码转换,⼀次是从指定编码转换为UNICODE编码,⼀次是从UNICODE编码转换为指定编码。
如果在读⼊时⽤错误的形式解码字符,则内存存储的是错误的UNICODE字符。
⽽从最初⽂件中读出的字符数据,到最终在屏幕终端显⽰这些字符,期间经过了应⽤程序的多次转换。
如果中间某次字符处理,⽤错误的编码⽅式解码了从输⼊流读取的字符数据,或⽤错误的编码⽅式将字符写⼊输出流,则下⼀个字符数据的接收者就会编解码出错,从⽽导致最终显⽰乱码。
这⼀点,是我们分析字符编码问题以及解决问题的指导思想。
好,现在我们开始⼀只只的解决这些乱码怪兽。
⼀、在JAVA⽂件中硬编码中⽂字符,在eclipse中运⾏,控制台输出了乱码。
例如,我们在JAVA⽂件中写⼊以下代码:String text = “⼤家好”;System.out.println(text);如果我们是在eclipse⾥编译运⾏,可能看到的结果是类似这样的乱码:。
那么,这是为什么呢?我们先来看看整个字符的转换过程。
1. 在eclipse窗⼝中输⼊中⽂字符,并保存成UTF-8的JAVA⽂件。
这⾥发⽣了多次字符编码转换。
不过因为我们相信eclipse的正确性,所以我们不⽤分析其中的过程,只需要相信保存下的JAVA⽂件确实是UTF-8格式。
2. 在eclipse中编译运⾏此JAVA⽂件。
这⾥有必要详细分析⼀下编译和运⾏时的字符编码转换。
– 编译:我们⽤javac编译JAVA⽂件时,javac不会智能到猜出你所要编译的⽂件是什么编码类型的,所以它需要指定读取⽂件所⽤的编码类型。
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中文乱码原因
Java在中文环境中乱码无处不在,而且出现的时间和位置也包涵广泛,具体的解决方法也是千奇百怪。
但是如果能理清其中的脉络,理解字符处理的过程,对于解决问题很有指导意义,不至于解决了问题也不知道为什么。
其实,原因不外乎出在String输入时和输出时。
首先,Java中的任何String都是以UNICODE格式存在的。
很多人因为在GBK环境中使用String,会误以为String是GBK格式,实际上Java 的String类中并没有存储CharSet信息的字段, 所有String中的字符只会以UNICODE的2字节形式存在。
String在构造时会逐一把字符按指定编码(默认值为系统编码GBK),转换为UNICODE字符,存入一个Char(无符号16位)数组中。
如:
new String(bytes,"gbk");
并不是说,生成一个GBK编码的字符串,而是按GBK逐一辨认字节数组bytes中的字符转化为UNICODE。
假设,bytes本是按GB编码的,构造方法在发现一个最高位为0的byte就作为ascii字符处理,最高位为1就和后面的一个byte合成中文字符, 再转换编码。
可以看出,在这个过程中,编码选择错误就会导致程序按错误方法辨认bytes,乱码就出现了。
在这里产生的乱码,很多时候还可以通过.getByte()方法修复,还没有后面的严重。
如:
"中".getBytes("iso-8859-1");
因为iso-8859-1中没有中文,所以"中"的值被替换成63,显示'?',无法判断以前是什么值。
所以如下String将被破坏掉:
new String("中文".getBytes("iso-8859-1"),"iso-8859-1");
如果目标编码方式支持中文,就不会损坏String:
new String("中文".getBytes("utf-8"),"utf-8");
Java在显示字符时,还需要进行一次转换,把UNICODE字符转换成用于显示的字符编码形式。
很多时候,这个过程是自动的,会按系统的默认编码(一般是GBK)转换String。
如果和页面编码不一样,就会出现乱码,虽然在Java的程序中只有一种编码,输出却可以有不同的编码。
有时候,我们需要用 iso-8859-1格式分解String的中文,以便在不支持中文的系统中存储:
new String("中文".getBytes("GBK"),"iso-8859-1");
先通过GBK等支持中文的编码方式分解为byte数组,再做为iso-8859-1字符组成字符串,就避免了被替换为Char(63)。
例如:
1、在java的下载文件中,如果下载文件的代码写在jsp中,那么,我们需要将jsp中的中文内容由“iso-8859-1”转成“utf-8”.因为jsp的页面编码是“iso-88959-1”.
String filename=new String(ofilename.getBytes("iso-8859-1"),"utf-8");
2、如果下载的核心代码写在.java文件中,因为一般都会有encode过滤器,所以,从jsp传入java的中文本身就是utf-8编码,然而在下载时会将中文再次传入jsp,此时就需要将utf-8转成页面可以识别的“iso-8859-1”。
并且只需要改变在页面需要显示的中文,像路径这种在后台处理的就不需要转换了,反而会出错。
new String(aFileName.getBytes("utf-8"),"iso-8859-1")
3、所以说,一般上传文件不存在乱码问题。