java中的编码
来源:互联网 发布:MS和MA知乎 编辑:程序博客网 时间:2024/05/17 07:15
有关java的编码一直都不熟悉,都是在糊里糊涂的用。最近有时间,上网收集了一些相关的资料,稍作整理,有几点收获,愿与大家分享。
1. java环境相关的编码。
Java的字符串是unicode编码的。这个是理解java编码的基础,一定要记住!
此外,Java的class文件采用utf-8的编码方式,JVM运行时采用utf-16。
2. 经常出现的几种编码方式介绍。
1) ISO8859-1。它是属于单字节编码,字符范围是0-255,应用于英文系列。当然,它是没法表示中文了。虽然这个编码表示的范围很弱,但是它的作用可不小。很多协议默认都采用该编码,它也是Java网络传输使用的标准字符集,关于这一点,后面会讲到。
2) GB2312/GBK。gb2312属于双字节编码,它是专门的中文编码方式(兼容iso8859-1),准确的说是简体中文编码。gbk是对gb2312的扩充,它可以表示繁体中文和简体中文。还有一种GB18030,它也是gb2312的扩充,收录了我国少数民族的文字。
3) Unicode。它是统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。它不兼容任何编码。其实相对于iso8859-1编码来说,unicode编码只是在前面增加了一个0字节,比如字母a为"00 61"。
4) UTF。utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。这样比unicode省空间。
关于编码的更多详细情况,请Google吧,它能告诉你一切想要的!
对字符串“中文”进行编码,测试代码如下:
public static String encode(String str, String charset) {
if (StringUtil.isNil(str))
return "";
String s = str;
try {
s = URLEncoder.encode(str, charset);
} catch (UnsupportedEncodingException e) {
System.out.println("编码方式有误:"+e.getMessage());
}
return s;
}
public static void main(String[] args) {
String s1 = "中文";
String iso = encode(s1, "iso-8859-1"); //不支持中文,所以编码后为3f3f(??)
String gb = encode(s1, "gb2312");
String unicode = encode(s1, "unicode");
String utf8 = encode(s1, "utf-8");;
System.out.println("ISO8859-1编码: "+ iso);
System.out.println("gb2312编码: "+ gb);
System.out.println("utf-8编码:: "+ utf8);
System.out.println("unicode编码:"+ unicode);
}
程序执行结果如下:
ISO8859-1编码: %3F%3F
gb2312编码: %D6%D0%CE%C4
utf-8编码:: %E4%B8%AD%E6%96%87
unicode编码:%FE%FF%4E%2D%65%87
3.java虚拟机的默认编码方式
System.out.println(Charset.defaultCharset());
默认 charset 在虚拟机启动时决定,通常根据语言环境和基础操作系统的 charset 来确定。在我的机器下打印出的结果:
GBK
4. 需要注意java编码的时候
1)读取外部文件时。
简单讲,一句话,采用什么编码方式编写的文件就用什么方式读取。不然就可能是乱码
新建一个记事本,写入部分数据,直接保存为code.txt(3中所示,我的机器上默认的就是gbk编码)。之后将该文件另存为utf-8格式的文件。
String filestr = "";
try {
InputStream is = new FileInputStream("F:/code2.txt");
InputStreamReader reader = new InputStreamReader(is,"utf-8");
int tempchar;
while ((tempchar = reader.read()) != -1) {
if (((char) tempchar) != '/r') {
//System.out.print((char) tempchar);
filestr += Character.toString(((char) tempchar));
}
}
reader.close();
} catch (FileNotFoundException e) {
System.out.println("找不到指定文件!");
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件的内容:");
System.out.println(filestr);
测试结果:
文件的内容:
编码测试
中文
上面的代码中,将code2.txt换为code.txt,同时去掉InputStreamReader中的“utf-8”参数,也可以正常输出。因为InputStreamReader采用的编码方式是JVM的默认字符集,在我的机器上也就是gbk了。试着直接去掉上面代码中的InputStreamReader中的“utf-8”,那么你将很荣幸的见到:
文件的内容:
缂栫爜娴嬭瘯
涓枃
2) 网页表单提交的时候
其实这个可以用其他的方式避免编码问题,参考http://www.examda.com/Java/jichu/20080409/105519579.html。
我在这讲一种经常用到的“编码转换”方式:
byte[] b = strIn.getBytes("ISO-8859-1");
strOut = new String(b, "GB2312");
前面提到ISO-8859-1的作用,这里可以讲一下了。
首先讲一下这段代码的意思,强调一点,这段代码并不是真的将一种编码方式转化为另外一种。事实是这样的:我们本应该用GB2312的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。现在要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码GB2312再次解码成字符串(即把以GB2312编码的数据转成unicode的字符串)。再次强调,java中字符串永远都是unicode编码的!。
现在可以说一下这段代码为什么出现了。iso-8859-1是JAVA网络传输使用的标准 字符集,而gb2312是标准中文字符集,当你提交中文表单,即有了网络传输操作,,浏览器会用gb2312格式来解释iso-8859-1字符集,由于两者不兼容,所以会出现乱码。这段代码就是解决乱码的一个方法。
就这么多了。
- Java中的字符编码
- java中的字符编码
- java中的base64编码
- Java中的字符编码
- java中的字符集编码
- java中的编码
- Java中的编码问题
- 关于Java中的编码
- java中的编码
- java中的编码问题
- java中的编码格式
- java 中的编码格式
- 关于JAVA中的编码
- 关于Java中的编码
- java中的编码问题
- java中的编码问题
- java中的编码问题
- Java中的编码格式
- java 最快速简单转换(unicode字符)国际化资源文件
- 反病毒引擎设计(三):病毒实时监控之概论
- 借我,许一个愿
- 反病毒引擎设计(三):病毒实时监控之WIN9X下的病毒实时监控
- Java日期格式--字符串与Date格式的转换
- java中的编码
- 反病毒引擎设计(四):WINNT/2000下的病毒实时监控
- Fedora14下httpd常用模块安装
- LINUX netlink机制
- 深入解析C++类对象的赋值复制与类型转换
- C# DataTable 导出excel (excel文件的行数可以控制/excel文件的个数可以控制)
- 用U盘做的ubuntu10.04系统盘装机后,用户登录GNOME后,数秒后系统的死机的解决
- 行级锁和表级锁
- SPC