String.getBytes("Unicode")的疑问 以及 SHIFT-JIS编码范围

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以外的语言编写,有可能不会使用这种方式来标识字节顺,因此要了解对方的细节,这样才能保证数据 的准确传递。






+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

想把一个文件中的日文部分提取出来,可是其他的东西都不知道是什么,好在还能查到SHIFT-JIS编码的范围。有个范围怎么着还是能将就是把文字提出来,只是没有格式罢了。转自:http://blog.csdn.net/walacewang/archive/2006/03/03/614382.aspx

Shift_JIS是一个日本电脑系统常用的编码表。它能容纳全形及半形拉丁字母、平假名、片假名、符号及日语汉字。

它被命名为Shift_JIS的原因,是它在放置全形字符时,要避开原本在0xA1-0xDF放置的半角假名字符。

在微软及IBM的日语电脑系统中,即使用了这个编码表。这个编码表称为CP932。

字节结构
以下字元在Shift_JIS使用一个字节来表示。

ASCII字符 (0×20-0×7E),但”\”被\\”¥”取代
ASCII控制字符 (0×00-0×1F、0×7F)
JIS X 0201标准内的半角标点及片假名(0xA1-0xDF)
在部分操作系统中,0xA0用来放置”不换行空格\\”。
以下字元在Shift_JIS使用两个字节来表示。

JIS X 0208字集的所有字符

“第一位字节\\”使用0×81-0×9F、0xE0-0xEF (共47个)
“第二位字节\\”使用0×40-0×7E、0×80-0xFC (共188个)

使用者定义区

“第一位字节\\”使用0xF0-0xFC (共47个)
“第二位字节\\”使用0×40-0×7E、0×80-0xFC (共188个)

在Shift_JIS编码表中,并未使用0xFD、0xFE及0xFF。

在微软及IBM的日语电脑系统中,在0xFA、0xFB及0xFC的两字节区域,加入了388个JIS X 0208没有收录的符号和汉字。


你可能感兴趣的:(String.getBytes("Unicode")的疑问 以及 SHIFT-JIS编码范围)