java编码方式及处理方法介绍
按照步骤运行下面代码:
System.out.println(Charset.defaultCharset());
所输出结果均已本地测试为准。不同操作系统可能输出结果不同
执行上述代码 :GBK 表明系统默认的编码方式为GBK
打开记事本,新建一个文件。取名为 gbk.txt;之所以取名为gbk,是因为该文件是按照系统默认的编码方式编码,及GBK,文件内容为 :挨踢good
执行下述代码:
// gbk.txt use the default character encoding
InputStream is1 = new FileInputStream("gbk.txt");
InputStreamReader streamReader1 = new InputStreamReader(is1);
char[] chars1 = new char[is1.available()];
streamReader1.read(chars1, 0, is1.available());
System.out.println(new String(chars1));
输出结果:挨踢 bad
执行下述代码:
System.out.println("------------utf----------------");
InputStream is = new FileInputStream("gbk.txt");
InputStreamReader streamReader = new InputStreamReader(is, "utf-8");
System.out.println("change encoding " + streamReader.getEncoding());
char[] chars = new char[is.available()];
streamReader.read(chars, 0, is.available());
System.out.println(new String(chars));
输出结果:------------utf----------------
change encoding UTF8
????good
解释:在此处,当我们使用utf-8 编码方式读取文件gbk.txt时,文件出现乱码。是因为我们是用系统默认的“gbk”编码方式创建的文件。当用utf-8读取时,文件肯定出错。
2,为什么 good 输出没有乱码?这与具体的编码方式有关,对于英文字母的处理,gbk 和utf-8采取的编码方式可以看做是没有出入的。具体可参http://alan0509.iteye.com/blog/729929
执行下述代码:
创建文件,utf8.txt,很明显,采用的编码方式是utf-8。文件内容为:上海世大咨询(在此,我没有加入英文。)
执行下面代码:
System.out.println("------------utf----------------");
InputStream is2 = new FileInputStream("utf8.txt");
InputStreamReader streamReader2 = new InputStreamReader(is2);
System.out.println("use gbk to read utf-8 "
+ streamReader2.getEncoding());
char[] chars2 = new char[is2.available()];
streamReader2.read(chars2, 0, is2.available());
System.out.println(new String(chars2) + chars2.length);
输出结果:
------------utf----------------
use gbk to read utf-8 GBK
锘夸笂娴蜂笘澶у挩璇 21
可见,当我们读取一个文件时,如果不指定编码方式,将自动采用“系统默认的方式读取”。至此,我们发现第一个乱码问题:当我们读取文件时,有必要知道文件的编码方式。
执行下面代码:
System.out.println("-----------use byte-----------------");
File file2 = new File("utf8.txt");
InputStream inputStream = new FileInputStream(file2);
byte[] bs = new byte[(int) file2.length()];
inputStream.read(bs);
String s = new String(bs, "utf-16");
System.out.print("use byte to read utf-8,and use utf-16 decode"
+ "use utf-16 " + s);
System.out.println();
String s2 = new String(bs, "utf-8");
System.out.print("use byte read utf-8,and utf-8 decode" + "use utf-8 "
+ s2);
System.out.println();
输出结果:
-----------use byte-----------------
use byte to read utf-8,and use utf-16 decodeuse utf-16 ??????銨??
use byte read utf-8,and utf-8 decodeuse utf-8 ?上海世大咨询
结果解释:此处,我采取的方式是将文件中的内容以字节方式读取,然后针对字节进行编码。当我采用utf-16编码时并不能还原文件。当采用utf-8编码时能还原文件。但此处多出一个问号。具体原因将在后面文章中介绍。
执行下面代码:
System.out.println("------------utf----------------");
File file = new File("utf8.txt");
InputStream is3 = new FileInputStream(file);
InputStreamReader streamReader3 = new InputStreamReader(is3, "utf-8");
System.out.println(streamReader3.getEncoding());
char[] chars3 = new char[is3.available()];
streamReader3.read(chars3, 0, is3.available());
System.out.println(new String(chars3));
输出结果:
------------utf----------------
UTF8
?上海世大咨询 注:问号问题将在后面介绍。
执行下面代码:
System.out.println("------------------------");
String sp = "上海世大";
// use default encodeing to get bytes
byte[] bs2 = sp.getBytes();
byte[] bs3 = sp.getBytes("utf-8");
String string = new String(bs3, "utf-8");
String string2=new String(bs2,Charset.defaultCharset());
String string3 = new String(bs2, "utf-16");
System.out
.println("use default character encodeing,and then use utf-8 to decode "
+ string);
System.out
.println("use default character encodeing,and then use gbk to decode "
+ string2);
System.out
.println("use default character encodeing,and then use utf-16 to decode "
+ string3);
输出结果:
------------------------
use default character encodeing,and then use utf-8 to decode 上海世大
use default character encodeing,and then use gbk to decode 上海世大
use default character encodeing,and then use utf-16 to decode ????
可见当我们使用getbytes方法时,指定具体编码方式是有好处的。
对java处理编码的一点补充:
- Java的class文件采用utf8的编码方式,JVM运行时采用utf16。(注意是java的class文件。.java文件并不是class文件,我们写的java文件在没有指定编码的情况下,将根据IDE工具指定的编码方式。一般情况下会采用系统默认的编码方式,所以我们的java文件拿到不同的机器上运行时可能出现乱码,具体原因上面文章有介绍。)
- 请看我的第三篇文章。
分享到:
相关推荐
本文将围绕“Java编码与乱码”这一主题展开,探讨字符编码系列的第一部分。 首先,我们需要理解什么是字符编码。字符编码是计算机用于表示文字、符号等字符的方式,它为每个字符分配了一个唯一的数字,使得计算机...
2. Java编码转换的详细过程 Java程序的生命周期包括编写、编译和执行三个阶段: - **编写阶段**:开发者在特定操作系统(如中文Win2K)的文本编辑器中创建源代码文件(.java),文件通常按照系统默认编码(GBK)...
乱码问题主要源自计算机操作系统的字符编码方式以及Java内部使用的UNICODE编码之间的转换过程。在深入解析这一过程后,我们可以透视Java中文问题产生的根本原因,并给出最优化的解决方案。 首先,计算机最初的操作...
### Java中文乱码字符集解决大全 #### 一、中文问题的来源与背景 随着信息技术的发展,计算机系统从最初仅支持单字节字符编码(如ASCII),逐渐演变为支持多种多样的字符集,以满足全球不同语言的需求。这其中最...
在 Java 中,`String` 类型是一种特殊的类型,它用来表示一系列字符的序列。Java 的 `String` 类内部是以 Unicode 编码存储的,这意味着每个字符都对应一个特定的 Unicode 码点。 #### 三、字符编码转换 在实际...
Java 中文乱码问题是一个常见的编程困扰,尤其对于处理中文字符的Java程序而言。这个问题通常源于字符编码的不一致,即不同环节采用的字符编码标准不统一。本文将深入探讨这一问题,并提供相应的解决方案。 首先,...
这是因为在编译 Servlet 类或者 JSP 文件时,如果没有使用 -encoding 参数指定 Java 源程序的编码格式,javac 会获取本地操作系统默认采用的字符集,以该字符集将 Java 源程序转换为 Unicode 编码保存到内存中,然后...
理解和掌握Java编码转换的过程,以及如何适配各种环境,是解决Java中文乱码问题的关键。在开发和部署Java应用时,应确保编码的一致性,避免因编码不匹配导致的乱码现象,提高程序的可移植性和兼容性。
为了处理不同编码格式的数据,Java提供了一系列的字符流和字节流类,如`InputStreamReader`和`OutputStreamWriter`等,它们可以将字节流转换为字符流,从而实现对各种编码格式的支持。 在实际开发中,理解字符集和...
在Java中,字符乱码通常是由于字符编码不一致导致的。例如,一个以UTF-8编码的文件被误认为是GBK编码来读取,就会出现乱码现象。为了解决这个问题,Java提供了`java.nio.charset.Charset`、`java.io....
综上所述,理解Java编码处理机制以及中文乱码产生的原因,对于解决实际开发中的乱码问题至关重要。开发者应关注源代码的编码设置、文件读写和网络通信中的编码转换,以确保Java程序在各种环境下都能正确处理中文字符...
Java中文乱码问题是编程者在开发Java应用程序时经常遇到的问题,尤其是涉及到中文字符处理时。这些问题产生的根本原因在于Java内部采用UNICODE编码,而不同的操作系统和浏览器可能支持不同的编码格式,如Windows中文...
在IT行业中,字符集编码是基础且至关重要的概念,尤其对于Java开发者来说,理解编码机制是处理各种文本数据的关键。本文将围绕“Java字符集编码简记”这一主题,深入探讨相关知识点,并结合标签“源码”和“工具”,...
Java中的字符编码转换是编程实践中一个至关重要的概念,尤其是在处理多语言环境和跨平台交互时。Java通过统一采用UTF-16编码格式在JVM内部处理字符,简化了字符操作的复杂性。UTF-16是一种变长的Unicode编码,它可以...
总之,解决Java中的URL中文乱码问题需要理解URL编码的原理,并在客户端和服务器端采取相应的措施,确保编码和解码的一致性。无论是通过JavaScript编码、Java服务器端解码,还是调整服务器配置,关键在于确保字符集的...
当Java程序读取或写入包含中文字符的文件时,需要设置正确的字符编码。例如,使用`FileReader`和`FileWriter`时,可以通过构造函数传入`Charset`对象,如`new FileReader(file, "UTF-8")`。如果使用`BufferedReader...
在JAVA开发中,正确处理字符集编码至关重要,以避免乱码和数据不一致的问题。 一、ISO8859-1与ASCII ISO8859-1是一种单字节编码标准,通常用于西欧语言,其编码范围为0-255。在ISO8859-1中,ASCII字符集是其子集,...
Java 中文乱码问题详解 ...要解决乱码问题,我们需要了解 Java 处理字符的原理,并了解编译和运行时的字符编码转换过程。在编译时,需要指定正确的编码类型;在运行时,需要正确地处理字符编码转换,以避免乱码的出现。