|
|
|
其实汉字的编码转换很简单,希望这些代码对用Java的朋友有帮助.
[url=http://blog.csdn.net/pijianhua/articles/215977.aspx]http://blog.csdn.net/pijianhua/articles/215977.aspx
/*
* UnicodeTest.java
*
* Created on July 29, 2003, 12:59 PM
*/
/**
*
* @author abc
* @version
*/
public class UnicodeTest
{
public static void main(String args[])
{
UnicodeTest UT = new UnicodeTest();
UT.test1();
}
public void test1()
{
String str = "测试信息abc123";
try
{
byte[] b = str.getBytes("GBK");
System.out.println(str + " -(GBK)编码: " + bytesToHexStr(b));
System.out.println("");
str = new String(b, "GBK");
System.out.println("从GBK编码 " + bytesToHexStr(b) + " 重新转换为字串: " + str);
System.out.println("");
b = str.getBytes("UnicodeBigUnmarked");
System.out.println(str + " -(UCS2)编码: " + bytesToHexStr(b));
System.out.println("");
str = new String(b, "UnicodeBigUnmarked");
System.out.println("从(UCS2)编码 " + bytesToHexStr(b) + " 重新转换为字串: " + str);
System.out.println("");
b = str.getBytes("ASCII");
System.out.println(str + " -(ASCII)编码: " + bytesToHexStr(b));
System.out.println("");
}
catch(Exception e){}
}
private String bytesToHexStr(byte[] b)
{
if (b == null) return "";
StringBuffer strBuffer = new StringBuffer(b.length * 3);
for(int i = 0; i < b.length; i++)
{
strBuffer.append(Integer.toHexString(b & 0xff));
strBuffer.append(" ");
}
return strBuffer.toString();
}
}
运行此小程序的输出结果是:
测试信息abc123 -(GBK)编码: b2 e2 ca d4 d0 c5 cf a2 61 62 63 31 32 33
从GBK编码 b2 e2 ca d4 d0 c5 cf a2 61 62 63 31 32 33 重新转换为字串: 测试信息abc123
测试信息abc123 -(UCS2)编码: 6d 4b 8b d5 4f e1 60 6f 0 61 0 62 0 63 0 31 0 32 0 33
从(UCS2)编码 6d 4b 8b d5 4f e1 60 6f 0 61 0 62 0 63 0 31 0 32 0 33 重新转换为字串: 测试信息abc123
测试信息abc123 -(ASCII)编码: 3f 3f 3f 3f 61 62 63 31 32 33
对于直接从byte[]中获取字符串的值,则可以用下面的代码,转自SP网关的部分代码:
if(MessageCoding==8){//如果编码格式为UCS2,就转换成普通的String
try {
MessageContent = new String(MessageByte,"UnicodeBigUnmarked");
} catch (UnsupportedEncodingException e) {
}
}else{
MessageContent = new String(MessageByte);
}
另外一个例子,阐释了unicode的几种不同:
[url=http://agilejava.blogbus.com/logs/196050.html]http://agilejava.blogbus.com/logs/196050.html
String.getBytes(charsetName),这个方法很多人都用过,可是有没有试过temp.getBytes("Unicode");这样的用法,它的返回值很奇怪,第1和第2个字节是-1或-2,比如下面的代码,你能想象出它的结果吗?
String temp = "a";
try {
byte[] unicodes = temp.getBytes("Unicode");
System.out.println("unicodes=" + unicodes.length);
for (int i = 0; i < unicodes.length; i++) {
System.out.println(unicodes[i]);
}
unicodes = temp.getBytes("UnicodeLittleUnmarked");
System.out.println("unicodes=" + unicodes.length);
for (int i = 0; i < unicodes.length; i++) {
System.out.println(unicodes[i]);
}
unicodes = temp.getBytes("UnicodeBigUnmarked");
System.out.println("unicodes=" + unicodes.length);
for (int i = 0; i < unicodes.length; i++) {
System.out.println(unicodes[i]);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
输出结果:
unicodes=4
-1
-2
97
0
unicodes=2
97
0
unicodes=2
0
97
为什么会有这种结果呢?蓝色的返回了四个字节,-1,-2,是字节顺的一种表示,这是由sun的类库实现,指示如果没有指定字节就使用默认的UnicodeLittle(在Window平台,别的平台我没测试),但为了标识这种字节顺,就使用了-1,-2在前面表示。
黑色的字,是UnicodeLittleUnmarked的结果,其返回字节只是两个字节,这与Unicode的编码相符合,注意到97,0与使用Unicode时后两个字节顺序一样。
红色的字,是使用UnicodeBigUnmarked的结果,字节顺与Little相反,也没有-1,-2.
由以上应该知道,temp.getBytes("Unicode");应该小心使用,应该注意它返回的-1,-2,这两个字节,因为在一些网络程序中,特别是当对方是由java以外的语言编写,有可能不会使用这种方式来标识字节顺,因此要了解对方的细节,这样才能保证数据的准确传递。
在程序员观点下,有字符和字节两个概念,但它们之间并没有直接的对应关系,只有在指定了一种特定的编码方式(比如 GB2312)后,才会有一定的对应关系。举例来说,一个中文字符,在 GB2312 的编码方式下对应两个字节,在 UTF-8 编码方式下对应三个字节,而在 UCS2 编码方式下对应两个字节;而对于标准 ASCII 字符来说,在 GB2312 和 UTF-8 编码方式下对应一个字节,在 UCS2 编码方式下对应两个字节。[/i][/i][/i] |
|