`
阿尔萨斯
  • 浏览: 4170173 次
社区版块
存档分类
最新评论

Java开发中字符编码转换

 
阅读更多

/*
 * 最早的编码是ISO-8859-1,和ASCII编码相似,属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。
 * 比如,字母'a'的编码为0x61=97。
 * 
 * 由于ISO-8859-1是单字节编码,和计算机最基础的表示单位一致,所以很多时候仍旧使用ISO-8859-1编码来表示,
 * 而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在ISO-8859-1编码,以GB2312编码为例,应该
 * 是"d6d0 cec4"两个字符,使用ISO-8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实
 * 上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87"。
 * 
 * GB2312/GBK是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和ISO-8859-1一致(兼容ISO-8859
 * -1编码)。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字,GBK是兼容GB2312编码的。
 *
 * Unicode是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。
 * 所以它不兼容ISO-8859-1编码,也不兼容任何编码。不过,相对于ISO-8859-1编码来说,Uniocode编码只是在
 * 前面增加了一个0字节,比如字母'a'为"00 61"。
 * 
 * 由于Unicode编码不兼容ISO-8859-1编码,而且容易占用更多的空间:因为对于英文字母,Unicode也需要两个
 * 字节来表示。所以Unicode不便于传输和存储。因此而产生了UTF编码,UTF编码兼容ISO-8859-1编码,同时也可以
 * 用来表示所有语言的字符,但UTF编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,UTF编码自带简单的校验
 * 功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
 *
 *
 */
package com.test;

import java.io.UnsupportedEncodingException;

public class TestCharset {
	/**
	 * @param args
	 * @throws UnsupportedEncodingException
	 */
	public static void main(String[] args) throws UnsupportedEncodingException {
		// TODO Auto-generated method stub
		String str = "abcdef中文";
		String strISO = null;
		String str2 = null;
		String charsetDef = "UTF-8";// UTF-8一般用3个字节表示一个汉字
		// String charsetDef = "GBK"; // GBK用2个字节表示一个汉字
		byte[] buf = null;
		byte[] bufISO = null;

		String encoding = System.getProperty("file.encoding");// 取得默认编码
		System.out.println("file.encoding:" + encoding);// file.encoding:GBK
		System.out.println();
		// 根据默认编码转换
		buf = str.getBytes();// 用默认编码解码
		strISO = new String(buf, "ISO-8859-1");// 用新的编码生成字符串
		System.out.println("strISO:" + strISO); // abcdef????
		bufISO = strISO.getBytes("ISO-8859-1"); // 用新的编码解码
		str2 = new String(bufISO, "GBK"); // 再回到默认编码
		System.out.println("str2:" + str2); // abcdef中文
		System.out.println();
		// 根据指定编码转换
		buf = str.getBytes(charsetDef);// 用指定编码解码
		strISO = new String(buf, "ISO-8859-1");// 用新的编码生成字符串
		System.out.println("strISO:" + strISO); // abcdef??????
		bufISO = strISO.getBytes("ISO-8859-1"); // 用新的编码解码
		str2 = new String(bufISO, charsetDef); // 再回到指定编码
		System.out.println("str2:" + str2); // abcdef中文
		System.out.println();

	}
}

输出:

file.encoding:GBK

strISO:abcdef????
str2:abcdef中文

strISO:abcdef??????
str2:abcdef中文

注意:两个?号代表一个字节。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics