码迷,mamicode.com
首页 > 编程语言 > 详细

Java里面String的编码问题

时间:2017-03-16 17:39:35      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:fse   charset   import   顺序   point   bsp   html   ng2   存在   

Java里面内置字符串全部是utf-16编码,详细的编码方式看这里

import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Map;

public class String2Bytes {
    public static void main(String[] args) {
        String str = "\u005Bab我";
        Map<String, Charset> charsetMap = Charset.availableCharsets();
        for(String charsetName : charsetMap.keySet()) {
            System.out.println(charsetName + ":" + charsetMap.get(charsetName));
        }
        System.out.println(str.charAt(3));
        //String的getBytes()方法是得到一个字串的字节数组,这是众所周知的。
        //但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组。
        //如果你在使用这个方法时不考虑到这一点,你会发现在一个平台上运行良好的系统,放到另外一台机器后会产生意想不到的问题。
        System.out.println(Arrays.toString(str.getBytes()));
        
        //附加级别的字符
        char[] c = Character.toChars(Integer.parseInt("1D306", 16));
        String str1 = new String(c);
        System.out.println(str1);
        //附加级别的字符占用了2个代码单元
        System.out.println(c.length);
        System.out.println(str1.length());
        //但是只占用一个代码点
        System.out.println(str1.codePointCount(0, str1.length()));
        
        //访问第一个代码单元,这种做法是错误的
        System.out.println(str1.charAt(0));
        
        //查看保存在内存里的方式
        /*
         * 算法
         * H = Math.floor((c-0x10000) / 0x400)+0xD800
         * L = (c - 0x10000) % 0x400 + 0xDC00
         */
        System.out.println(Integer.toString((int)str1.charAt(0), 16));//0xD834
        System.out.println(Integer.toString((int)str1.charAt(1), 16));//0xDF06
        
        //访问第一个代码点,正确的做法
        int index = str1.offsetByCodePoints(0, 0);
        System.out.println(str1.codePointAt(index));
        
        String str2 = str1 + "abc";
        //顺序访问一个String正确的方式
        int count = str2.codePointCount(0, str2.length());
        for(int i=0; i < count; ++i) {
            int index1 = str2.offsetByCodePoints(0, i);
            int cp = str2.codePointAt(index1);
            System.out.print(Character.toChars(cp));
        }
        System.out.println();
    }
}

 

Java里面String的编码问题

标签:fse   charset   import   顺序   point   bsp   html   ng2   存在   

原文地址:http://www.cnblogs.com/chen8840/p/6560521.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!