Java里面String的编码问题

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();
    }
}
时间: 2024-08-08 01:25:44

Java里面String的编码问题的相关文章

hadoop中Text类 与 java中String类的区别

hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.例如 unicode就是一个字符集,它的目标是涵盖世界上所有国家的文字和符号: 字符编码:是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对.即在符号集

Java中String类学习总结

java中String类的使用频率非常高,本人在学习此模块时,认为下列几点知识值得注意: 一.String是不可变对象 java.lang.String类使用了final修饰,不能被继承.Java程序中的所有字面值,即双引号括起的字符串,如"abc",都是作为String类的实例实现的.String是常量,其对象一旦构造就不能再被改变.换句话说,String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创造了一个全新的String对象,以包含修改后的字符串内容.而最

Java中String连接性能的分析

总结:如果String的数量小于4(不含4),使用String.concat()来连接String,否则首先计算最终结果的长度,再用该长度来创建一个StringBuilder,最后使用这个StringBuilder来连接所有String.      我建议大家如果确定需要连接的String的数量小于4的,直接使用String.concat()来连接,虽然StringBundler能够帮你自动处理这一情况,但创建一个String[]和那些方法调用都是一些无谓的开销. Java中的String是一个

深入分析Java的String类的方法与特点

字符串是任何编程语言都必须支持的变量类型,有些编程语言是直接提供了原生的变量类型,有些编程语言则使用语法特性以 SDK 的形式提供支持.在Java编程平台中,对字符串的支持使用了后者的形式,就是通过在 JDK中提供一个名为String的类,对应字符串这个变量类型. 源码分析 既然JDK中的String类对应了字符串变量类型,为了熟练地掌握Java中字符串相关的技能,我们必须深入地分析和研究一下这个类.编码界有一句名言叫做 "源码面前,了无秘密",因此,我们第一步就是来看看String类

java.lang.String.getBytes(String charsetName)方法实例

java.lang.String.getBytes(String charsetName) 方法编码将此String使用指定的字符集的字节序列,并将结果存储到一个新的字节数组. 声明 以下是java.lang.String.getBytes()方法的声明 public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 参数 charset -- 这是一个支持的字符集的名称. 返回值 此方法返回得到的字节

java.lang.String类

复制下来的java.lang.String源码.在此基础上添加自己的注释,偷懒了,用来加深印象吧.英语不好,没有翻译,不理解的方法直接百度的.然后按照自己的理解描述. /* * @(#)String.java 1.205 09/02/26 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */

转:Java中String与byte[]的转换

fuzhaoyang 转:Java中String与byte[]的转换 原文地址:http://blog.csdn.net/llwan/article/details/7567906 String s = "fs123fdsa";//String变量 byte b[] = s.getBytes();//String转换为byte[] String t = new String(b);//bytep[]转换为String 做JAVA经常会碰到中文乱码问题,还有各种编码的问题,特别是Stri

Java IO4:字符编码

前言 字符编码,这本不属于IO的内容,但字节流之后写的应该是字符流,既然是字符流, 那就涉及一个"字符编码的"问题,考虑到字符编码不仅仅是在IO这块,Java中很多场景都涉及到这个概念,因此这边文章就专门详细写一下字符编码,具体 的网上有很多,但本文目的是尽量讲清楚各种编码方式的作用,个人认为,不求.也没有必要对字符编码理解地多么深入. 字符集和字符编码 第一个概念就是字符集和字符编码之间的区别: 1.字符集(charset) 字符集指的是一个系统支持的所有抽象字符的集合.字符是各种文

java中URL 的编码和解码函数

java中URL 的编码和解码函数java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);在javascript 中URL 的编码和解码函数escape(String s)和unescape(String s) ; 在前台:var url="test.jsp?param="+escape('this%is#te=st&o k?+/');在后台: String param=request.