import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
/**
* @author Ian Chan
* @version 1.0
*/
public class TestEncoding {
private static final String NEWLINE = "\r\n";
public static void main(String[] args) throws IOException {
StringBuilder builder = new StringBuilder();
builder.append("Java字符串采用UNICODE" + NEWLINE);
builder.append("系统(JVM)默认编码为:" + Charset.defaultCharset() + NEWLINE);
builder.append("系统(JVM)支持的字符集:" + Charset.availableCharsets() + NEWLINE);
InputStream is = new FileInputStream("F:\\data.txt");
InputStreamReader reader = new InputStreamReader(is);
builder.append("没有指定读取文件的字符集,采用(JVM)字符集:" + reader.getEncoding() + NEWLINE);
BufferedReader bReader = new BufferedReader(reader);
String line;
while ((line = bReader.readLine()) != null) {
builder.append(line + NEWLINE);
}
is.close();
builder.append("========================================" + NEWLINE);
is = new FileInputStream("F:\\data.txt");
reader = new InputStreamReader(is, "GB18030");//以GB18030进行编码
builder.append("指定读取文件的字符集:" + reader.getEncoding() + NEWLINE);
bReader = new BufferedReader(reader);
while ((line = bReader.readLine()) != null) {
builder.append(line + NEWLINE);
}
is.close();
builder.append("========================================" + NEWLINE);
builder.append("通过IDE(myeclipse)创建文件data.dat,UTF-8的编码方式" + NEWLINE);
is = new FileInputStream("E:\\myencoding\\data.dat");
reader = new InputStreamReader(is, "UTF8");//指定为UTF-8的才不会乱码
builder.append("指定读取文件的字符集:" + reader.getEncoding() + NEWLINE);
bReader = new BufferedReader(reader);
String string = "";
while ((line = bReader.readLine()) != null) {
builder.append(line + NEWLINE);
string = line;
}
//以JVM默认编码(GBK)进行解码UTF8编码的串,并转成UTF8格式,最后转成UNICODE的字符串,会乱码
//String newString = new String(string.getBytes("utf8"), "utf8");//不会乱码
String newString = new String(string.getBytes(), "utf8");
is.close();
builder.append("用UTF8方式得到的字符串,通过其他编码方式得到新串:" + NEWLINE + newString + NEWLINE);
builder.append("========================================" + NEWLINE);
String str = "我的password";
builder.append("str.getBytes():" + NEWLINE);
for (byte b : str.getBytes()) {
builder.append(b + ",");
}
builder.append(NEWLINE);
builder.append("str.getBytes(defaultSet):" + NEWLINE);
for (byte b : str.getBytes(Charset.defaultCharset())) {
builder.append(b + ",");
}
builder.append(NEWLINE);
builder.append("========================================" + NEWLINE);
//"我的password"这个字符串以JVM默认编码(gbk)方式编码,以gbk的编码获得byte数组,
//以gb2312方式编码并以UNICODE转成新的串不会乱码
//以utf8的方式会乱码
String newStr = new String(str.getBytes("gbk"), "gb2312");
builder.append("利用getBytes创建新的字符串:" + NEWLINE);
builder.append(newStr + NEWLINE);
System.out.println(builder.toString());
}
}
控制台打印结果:
Java字符串采用UNICODE
系统(JVM)默认编码为:GBK
系统(JVM)支持的字符集:{Big5=Big5, Big5-HKSCS=Big5-HKSCS, EUC-JP=EUC-JP, EUC-KR=EUC-KR, GB18030=GB18030, GB2312=GB2312, GBK=GBK, hp-roman8=hp-roman8, IBM-037=IBM-037, IBM-500=IBM-500, IBM-Thai=IBM-Thai, IBM00858=IBM00858, IBM01140=IBM01140, IBM01141=IBM01141, IBM01142=IBM01142, IBM01143=IBM01143, IBM01144=IBM01144, IBM01145=IBM01145, IBM01146=IBM01146, IBM01147=IBM01147, IBM01148=IBM01148, IBM01149=IBM01149, IBM037=IBM037, IBM1026=IBM1026, IBM1047=IBM1047, IBM273=IBM273, IBM277=IBM277, IBM278=IBM278, IBM280=IBM280, IBM284=IBM284, IBM285=IBM285, IBM297=IBM297, IBM420=IBM420, IBM424=IBM424, IBM437=IBM437, IBM500=IBM500, IBM775=IBM775, IBM850=IBM850, IBM852=IBM852, IBM855=IBM855, IBM857=IBM857, IBM860=IBM860, IBM861=IBM861, IBM862=IBM862, IBM863=IBM863, IBM864=IBM864, IBM865=IBM865, IBM866=IBM866, IBM868=IBM868, IBM869=IBM869, IBM870=IBM870, IBM871=IBM871, IBM918=IBM918, ISO-2022-CN=ISO-2022-CN, ISO-2022-JP=ISO-2022-JP, ISO-2022-JP-2=ISO-2022-JP-2, ISO-2022-KR=ISO-2022-KR, ISO-8859-1=ISO-8859-1, ISO-8859-13=ISO-8859-13, ISO-8859-15=ISO-8859-15, ISO-8859-2=ISO-8859-2, ISO-8859-3=ISO-8859-3, ISO-8859-4=ISO-8859-4, ISO-8859-5=ISO-8859-5, ISO-8859-6=ISO-8859-6, ISO-8859-7=ISO-8859-7, ISO-8859-8=ISO-8859-8, ISO-8859-9=ISO-8859-9, JIS_X0201=JIS_X0201, JIS_X0212-1990=JIS_X0212-1990, KOI8-R=KOI8-R, KOI8-U=KOI8-U, Shift_JIS=Shift_JIS, TIS-620=TIS-620, US-ASCII=US-ASCII, UTF-16=UTF-16, UTF-16BE=UTF-16BE, UTF-16LE=UTF-16LE, UTF-32=UTF-32, UTF-32BE=UTF-32BE, UTF-32LE=UTF-32LE, UTF-8=UTF-8, windows-1250=windows-1250, windows-1251=windows-1251, windows-1252=windows-1252, windows-1253=windows-1253, windows-1254=windows-1254, windows-1255=windows-1255, windows-1256=windows-1256, windows-1257=windows-1257, windows-1258=windows-1258, windows-31j=windows-31j, x-Big5-Solaris=x-Big5-Solaris, x-euc-jp-linux=x-euc-jp-linux, x-EUC-TW=x-EUC-TW, x-eucJP-Open=x-eucJP-Open, x-IBM1006=x-IBM1006, x-IBM1025=x-IBM1025, x-IBM1046=x-IBM1046, x-IBM1097=x-IBM1097, x-IBM1098=x-IBM1098, x-IBM1112=x-IBM1112, x-IBM1122=x-IBM1122, x-IBM1123=x-IBM1123, x-IBM1124=x-IBM1124, x-IBM1381=x-IBM1381, x-IBM1383=x-IBM1383, x-IBM33722=x-IBM33722, x-IBM737=x-IBM737, x-IBM834=x-IBM834, x-IBM856=x-IBM856, x-IBM874=x-IBM874, x-IBM875=x-IBM875, x-IBM921=x-IBM921, x-IBM922=x-IBM922, x-IBM930=x-IBM930, x-IBM933=x-IBM933, x-IBM935=x-IBM935, x-IBM937=x-IBM937, x-IBM939=x-IBM939, x-IBM942=x-IBM942, x-IBM942C=x-IBM942C, x-IBM943=x-IBM943, x-IBM943C=x-IBM943C, x-IBM948=x-IBM948, x-IBM949=x-IBM949, x-IBM949C=x-IBM949C, x-IBM950=x-IBM950, x-IBM964=x-IBM964, x-IBM970=x-IBM970, x-ISCII91=x-ISCII91, x-ISO-2022-CN-CNS=x-ISO-2022-CN-CNS, x-ISO-2022-CN-GB=x-ISO-2022-CN-GB, x-iso-8859-11=x-iso-8859-11, x-JIS0208=x-JIS0208, x-JISAutoDetect=x-JISAutoDetect, x-Johab=x-Johab, x-MacArabic=x-MacArabic, x-MacCentralEurope=x-MacCentralEurope, x-MacCroatian=x-MacCroatian, x-MacCyrillic=x-MacCyrillic, x-MacDingbat=x-MacDingbat, x-MacGreek=x-MacGreek, x-MacHebrew=x-MacHebrew, x-MacIceland=x-MacIceland, x-MacRoman=x-MacRoman, x-MacRomania=x-MacRomania, x-MacSymbol=x-MacSymbol, x-MacThai=x-MacThai, x-MacTurkish=x-MacTurkish, x-MacUkraine=x-MacUkraine, x-MS932_0213=x-MS932_0213, x-MS950-HKSCS=x-MS950-HKSCS, x-mswin-936=x-mswin-936, x-PCK=x-PCK, x-SJIS_0213=x-SJIS_0213, x-UTF-16LE-BOM=x-UTF-16LE-BOM, X-UTF-32BE-BOM=X-UTF-32BE-BOM, X-UTF-32LE-BOM=X-UTF-32LE-BOM, x-windows-50220=x-windows-50220, x-windows-50221=x-windows-50221, x-windows-874=x-windows-874, x-windows-949=x-windows-949, x-windows-950=x-windows-950, x-windows-iso2022jp=x-windows-iso2022jp}
没有指定读取文件的字符集,采用(JVM)字符集:GBK
阿斯顿飞aaa
========================================
指定读取文件的字符集:GB18030
阿斯顿飞aaa
========================================
通过IDE(myeclipse)创建文件data.dat,UTF-8的编码方式
指定读取文件的字符集:UTF8
通过myeclipse创建的文件
用UTF8方式得到的字符串,通过其他编码方式得到新串:
通过myeclipse创建的文件
========================================
str.getBytes():
-50,-46,-75,-60,112,97,115,115,119,111,114,100,
str.getBytes(defaultSet):
-50,-46,-75,-60,112,97,115,115,119,111,114,100,
========================================
利用getBytes创建新的字符串:
我的password
参考转载的文章分析如下:
我们经常会遇到编码问题。Java号称国际化的语言,是因为它的class文件采用UTF-8,而JVM运行时使用UTF-16(至于为什么JVM中要采用UTF-16,我没看过 相关的资料,但我猜可能是因为JAVA里面一个字符(char)就是16位的,而UTF-16正是双字节编码),都是unicode的编码。
unicode 的目标就是能支持世界上所有的字符集,也就是说几乎所有的字符集包含的字符在unicode中都有对应的编码。在unicode中,字符与代码的映射关 系,就是unicode字符集,称为UCS(Unicode Character Set),每个unicode字符编码称为code point(代码点?)。UTF-8和UTF-16是不同的UCS编码方法,UTF就是UCS Transformation Format。;
在Java 中,String的getBytes()方法就是对特定的字符串(unicode)按照给定的字符集进行编码(encode),new String()则可以按照某个字符集将字节流转换回unicode(decode)。Java里面的每一个String都是unicode编码。
再来看页面,如果不做特殊处理,Form的提交就按照页面的ContentType设置中的字符集进行编码转换,发送到后台,后台必须利用req.setCharacterEncoding来指定参数的编码格式(不同的应用服务器应有不同的指定方式),才能正确解码。
Java 里面的encode和decode都是相对于unicode而言的,encode的意思是将char[] --> XXX Encoding byte[],decode就是由XXX Encoding byte[] --> char[]。平常,当我们说“将GBK编码转换为UTF-8编码”的时候,实际的意思就是:GBK Encoding byte[] --> UTF-8 Encoding byte[],这种转换只有在需要用byte[]传输数据的时候才有意义,否则便是毫无意义的。
首先要说明的一点是:Java中的String对象就是一个unicode编码的字符串。
但是,我们通常会听到有人说:“我们需要将String由ISO-8859-1转换为GBK编码”,这又是怎么回事呢?实际上,我们并不是要“将 一个由ISO-8859-1编码的String转换为GBK编码的String”,反复说明的是,JAVA中的String都是unicode编码的,所以不存在“ISO- 8859-1编码的String”或“GBK编码的String”这样的说法。而需要转换的唯一的原因是String进行了错误的编码。我们经常会碰到由ISO-8859- 1转换为诸如GBK/UTF-8等等这样的需求。所谓的转换过程是:String --> byte[] -->String。
也许 你非常清楚这个过程的代码:new String(text.getBytes("ISO-8859-1"),"GBK")。但是,要真正理解起来并不是那么简单。表面上看似乎很容易理解, 不就是将text String对象按照ISO-8859-1的方式编码为byte[]然后再把它按照GBK的方式转换为String吗?但是这句代码很容易会被误解为: “将text String由ISO-8859-1转换为GBK编码”,这种说法是错误的。难道你见过用这样的代码:new String(text.getBytes("GBK"),"UTF-8")来对String进行编码转换的吗?
之所以你会经常看到new String(text.getBytes("ISO-8859-1"),"GBK")这句代码,是因为一个GBK的字节流被错误地以ISO-8859- 1的方式转换为String(unicode)了!发生这种情况最普遍的地方是一个GBK编码的网页向后台提交数据的时候,就有可能会看到这句代码的出 现。GBK的流被错误的当成ISO8859-1的流,所以便得到了一个错误的String。由于ISO8859-1是单字节编码,所以每个字节被按照原样 转换为String,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!所以那句经典的new String(text.getBytes("ISO-8859-1"),"GBK")便出现了。
如果系统误以为是其它编码格式,就有可能再也转换不回来了,因为编码转换并不是负负得正那么简单的。
【参考文章】
1.http://hukejia.iteye.com/blog/480526
2.http://www.iteye.com/topic/311583
分享到:
相关推荐
#### 三、Java编码转换的详细过程 Java程序从开发到运行的过程中,涉及到多个环节的编码转换,主要包括: 1. **源文件编码**:Java源文件(`.java`)在保存时通常采用操作系统默认的编码格式。例如,在中文Windows...
### Java获取乱码问题解析与解决方案 在Java应用开发过程中,字符编码问题一直是困扰开发者的一大难题,尤其是在处理HTTP请求中的中文或特殊字符时,经常会出现乱码现象。本文将详细介绍如何通过修改`server.xml`...
在Java编程中,中文编码问题是一个常见的挑战,尤其是在处理文本输入、输出以及网络通信时。本文将深入探讨Java中的中文编码问题,以及如何有效地解决这些问题。 首先,我们要了解字符编码的基本概念。字符编码是...
2. JAVA编码转换的详细过程: - 编程阶段:在中文操作系统(如Win2K)上,使用编辑器(如记事本)保存的.java文件采用系统默认编码(GBK)。 - 编译阶段:`javac.exe`编译.java文件,此时源代码的GBK编码不影响...
今天,我们将从编码角度分析 Java 编译后在控制台和 Web 等终端显示乱码问题。 一、 Java 处理字符的原理 Java 使用 UNICODE 来存储字符数据,处理字符时通常有三个步骤:按指定的字符编码形式,从源输入流中读取...
在Java开发过程中,尤其是在处理中文字符时,经常遇到字符编码不一致导致的乱码问题。由于Java默认使用Unicode编码,而在中国大陆地区,常见的字符集为GB2312(GB18030)或GBK,在台湾地区则多使用Big5编码。这些...
综上所述,解决Java HTTP请求传JSON数据乱码问题的关键在于确保前后端传输过程中字符编码的一致性。在JavaScript中,确保使用UTF-8编码序列化JSON对象,在Java服务端,使用`URLDecoder.decode`方法以正确的字符集...
在Java编程中,解析文件时可能会遇到乱码问题,这通常是由于字符编码不匹配或处理不当导致的。本文将深入探讨如何解决Java中文件解析时出现的乱码问题。 首先,理解字符编码至关重要。常见的字符编码有ASCII、ISO-...
### 深入分析Java中的中文编码问题 #### 一、引言 在软件开发过程中,尤其是涉及到国际化和多语言支持的应用中,编码问题一直是令开发者头疼的问题之一。尤其是在使用Java这种跨平台语言进行开发时,不同的操作...
本文将深入分析Java中文乱码问题的根本原因,介绍各种编码格式的区别和应用场景,并提供解决乱码问题的方法和经验。 在Java中,常见的编码格式有: * ASCII码:总共有128个,用一个字节的低7位表示,0~31是控制...
下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的表单数据中有中文字符 在 Servlet/JSP 程序中,通过请求对象的 getParameter() 方法得到的字符串是以 ISO-8859-1 转换而来,这...
在Java编程中,中文乱码问题是一个常见的困扰,尤其是在处理文件读写、网络传输或数据库操作时。本文将深入探讨几种解决Java中中文乱码问题的方法,并以MyEclipse为开发环境,结合实际示例进行讲解。 1. 文件读写中...
总结一下,Java中文乱码问题的解决主要依赖于以下几个关键点:正确设置源代码的编码、指定JVM的字符编码、理解并正确处理文件和网络通信的字符编码。通过细心的检查和配置,大部分乱码问题都能得到解决。同时,了解...
本篇文章将详细探讨如何在Java中解析CSV文件,并解决中文乱码的问题。 首先,我们需要了解如何使用Java的标准库`java.io`和`java.nio`来读取CSV文件。最常用的是使用`BufferedReader`配合`Scanner`或者`Files.lines...
总之,解决Java中的URL中文乱码问题需要理解URL编码的原理,并在客户端和服务器端采取相应的措施,确保编码和解码的一致性。无论是通过JavaScript编码、Java服务器端解码,还是调整服务器配置,关键在于确保字符集的...
Java编程中的中文乱码问题是一个常见但棘手的挑战,主要源于编码格式的不匹配和转换过程中的错误。本文深入探讨了这个问题,并提供了解决方案。 首先,我们要理解中文字符编码的历史背景。早期的计算机系统主要支持...
本文将详细讲解如何在Java环境中实现TLV的编码与解码,并结合提供的`ber-tlv`资源进行分析。 TLV结构简单明了,由三个部分组成: 1. **Tag**:标识数据的类型或者含义,通常是一个整数。 2. **Length**:表示Value...
在Java开发过程中,字符编码问题常常困扰着开发者,尤其是在处理中文等多字节字符时,乱码问题尤为突出。...通过上述详细的分析与策略实施,可以有效解决Java开发中的乱码问题,提升应用的稳定性和用户体验。