java 中字符串string编码方式探究

 

在java中的String.getBytes(String charset),会先把字符串按字符分为字符数组,然后按单个字符编码。



import java.io.UnsupportedEncodingException;

public class CharsetTest {
    public static void main(String[] args) throws UnsupportedEncodingException {

        String s3 = "\u0061";
        String s4="\u6c49";
        System.out.println(s3);
        System.out.println(s4+"\n");

        System.out.println("test string.getChars(...):");
        String s = "你好lkf&*";
        printChars(s);
        System.out.println();

        System.out.println("test string.getBytes(charset):\n");
        String s1 = "汉";
        String s2 = "a";
        //文件本身编码方式为utf-8
        System.out.println("\""+s1+"\""+"的编码结果:");
        printEncoding(s1,null);
        System.out.println("-------------------------");
        System.out.println("\""+s2+"\""+"的编码结果:");
        printEncoding(s2,null);

        System.out.println("\nBOM:Byte order marker,0xfeff为big-endian,0xfffe为litter-endian");
    }

    public static void printEncoding(String s1,String [] encodings) {
        String[] encodes = encodings==null?new String[]{"utf-8","utf-16","utf-16le","utf-16be","iso-8859-1","us-ascii", "gbk", "gb2312","gb18030","unicode"}:encodings;
        for (String encode : encodes) {
            byte[] bytes = null;
            try {
                System.out.print(encode+":");
                bytes = s1.getBytes(encode);
                StringBuilder x = toHexString(bytes);
                System.out.println(x);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }

    public static void printChars(String s) {
        char[] chars = new char[s.length()];
        s.getChars(0,s.length(),chars,0);
        for (char aChar : chars) {
            System.out.println(aChar);
        }
    }

    public static StringBuilder toHexString(byte[] bytes) {
        StringBuilder b = new StringBuilder("0x(");
        for(int i=0; i < bytes.length; i++){
            b.append(Character.forDigit((bytes[i] >> 4) & 0xF, 16));
            b.append(Character.forDigit((bytes[i] & 0xF), 16));
            if (i < (bytes.length - 1)) {
                b.append(" ");
            }
        }
        b.append(")");
        return b;
    }
}

结果为:

a

test string.getChars(...):


l
k
f
&
*

test string.getBytes(charset):

"汉"的编码结果:
utf-8:0x(e6 b1 89)
utf-16:0x(fe ff 6c 49)
utf-16le:0x(49 6c)
utf-16be:0x(6c 49)
iso-8859-1:0x(3f)
us-ascii:0x(3f)                   //0x3f表示?,表示无法编码
gbk:0x(ba ba)
gb2312:0x(ba ba)
gb18030:0x(ba ba)
unicode:0x(fe ff 6c 49) //0xfeff为big-endian BOM
-------------------------
"a"的编码结果:
utf-8:0x(61)
utf-16:0x(fe ff 00 61)
utf-16le:0x(61 00)
utf-16be:0x(00 61)
iso-8859-1:0x(61)
us-ascii:0x(61)
gbk:0x(61)
gb2312:0x(61)
gb18030:0x(61)
unicode:0x(fe ff 00 61)

BOM:Byte order marker,0xfeff为big-endian,0xfffe为litter-endian

上面为自己写的测试代码。

此处为转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词http://www.fmddlmyy.cn/text6.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java字符串编码方式通常有两种,一种是使用String类的getBytes方法将字符串编码成字节数组,另一种是使用字符流和字节流进行编码转换。 1. 使用String类的getBytes方法进行编码转换 String类的getBytes方法有多个重载,其一个常用的重载形式是getBytes(String charsetName),该方法接受一个字符集名称作为参数,指定字符串编码方式。例如,以下代码将一个字符串编码为UTF-8格式的字节数组: ``` String str = "Hello, world!"; byte[] bytes = str.getBytes("UTF-8"); ``` 同样地,可以将字符串编码为GBK格式的字节数组,只需要将字符集名称从"UTF-8"改为"GBK"即可: ``` String str = "你好,世界!"; byte[] bytes = str.getBytes("GBK"); ``` 需要注意的是,使用getBytes方法时需要注意编码方式的正确性,否则可能会出现乱码等问题。 2. 使用字符流和字节流进行编码转换 除了使用String类的getBytes方法进行编码转换外,还可以使用字符流和字节流进行编码转换。通常使用InputStreamReader和OutputStreamWriter这两个类进行字符流和字节流的转换。以下是一个将字符串从UTF-8编码转换为GBK编码的示例代码: ``` String str = "你好,世界!"; ByteArrayInputStream bis = new ByteArrayInputStream(str.getBytes("UTF-8")); ByteArrayOutputStream bos = new ByteArrayOutputStream(); InputStreamReader reader = new InputStreamReader(bis, "UTF-8"); OutputStreamWriter writer = new OutputStreamWriter(bos, "GBK"); char[] buffer = new char[1024]; int len; while ((len = reader.read(buffer)) != -1) { writer.write(buffer, 0, len); } writer.flush(); String result = bos.toString("GBK"); ``` 以上代码首先将字符串转换为UTF-8编码的字节数组,并使用ByteArrayInputStream将其包装成字节流。然后使用InputStreamReader将字节流转换为字符流,并指定字符集为UTF-8。接着使用OutputStreamWriter将字符流转换为字节流,并指定字符集为GBK。最后将转换后的字节数组包装成ByteArrayOutputStream,再将其转换为字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值