俊星的BLOG

JAVA字符编码

测试代码:
    public static void main(String[] args) {
        Locale.setDefault(Locale.US);
        String str 
= "中G中";
        String codes[] 
= "iso8859-1""utf-8""utf-16""unicode""gbk""gb2312" };
        
try {
            System.out.println(str);
            System.out.println(
"default code:" + System.getProperty("file.encoding"));
            
for (String s : codes) {
                System.out.println(s 
+ "" + toHex(str.getBytes(s)));
            }

        }
 catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }


    
private static String toHex(byte[] buffer) {
        StringBuffer sb 
= new StringBuffer(buffer.length * 3);

        
for (int i = 0; i < buffer.length; i++{
            sb.append(Character.forDigit((buffer[i] 
& 0xf0>> 416));
            sb.append(Character.forDigit(buffer[i] 
& 0x0f16));
            sb.append(
" ");
        }


        
return sb.toString();
    }

输出如下:
中G中
default code:GBK
iso8859-
1: 3f 47 3f 
utf-
8: e4 b8 ad 47 e4 b8 ad 
utf-
16: fe ff 4e 2d 00 47 4e 2d 
unicode: ff fe 2d 4e 
47 00 2d 4e 
gbk: d6 d0 
47 d6 d0 
gb2312: d6 d0 
47 d6 d0 

相关说明:
1、通过System.getProperty("file.encoding")获取到当前JVM的默认字符编码方式,如GBK
2、iso8859-1则是应用于英文和欧洲其他语言的单字节编码字符集,“3f”其实对应就是“?”。
3、utf-8则是unicode编码的一种转换方式(Unicode Transformation Format),兼容于ASCII编码,如对于中文则使用3个字节来存储,对于英文使用一个字节存储。
4、utf-16是unicode编码的另一种转换方式,每个直接都采用2个字节来存储,所以不兼容于ASCII;
      其中“fe ff”是Byte Order Mark(BOM)表示采用的编码方式为utf-16。
5、此处的unicode输出和utf-16本质相同,只不过大小尾序的问题导致单个字节输出顺序相反;
      其中对于windows和linux平台的utf-16默认采用小尾序(LE little Endion),mac平台采用大尾。
6、gbk和gb2312是中文字符集,对于每个字符均采用2个字节存储,其中gbk兼容gb2312并且还可表示繁体。

关于存储字节的计算,假设现在有N个中文和M个英文字符,则如下的计算方式(编码方式:字节数):
GBK:2*N+M
UTF-8:3*N+M
UTF-16:2*(N+M+1)
ISO8859-1:N+M

posted on 2009-05-26 00:12 俊星 阅读(219) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: