本人看到String类的一个构造方法时很是疑惑
public String(byte[] bytes, String charsetName);
如果我的charseName 16个位的编码方法,而bytes只能是8位的,也就是说这两者是包含关系?bytes数组中不能表示所有的符号?

解决方案 »

  1.   

    public String(byte[] bytes, String charsetName);
    一般是用来防止乱码问题,http协议神马的,对传送中文很不支持,所以iso-9001(忘记是不是了) 到 gb2312的转换就需要这个了。
    这里的charsetName只是为了告诉转换机制,并不强转。默认还是有值的。
      

  2.   

    “charseName 16个位的编码方法” 表示传入的byte[]是用两个byte表示一个字符进行构造字符串。这个有什么冲突吗?
      

  3.   

    bytes数组你可以理解为一个字节流,指定charsetName的话,就是使用什么编码方式去解析这个流,生成字符串。不指定的话就用默认的charsetName.
      

  4.   

    很好理解,无论是什么编码格式,到了二进制层面都是一个字节数组。
    而编码的意思,就是如何去把这个字节数组翻译成对应的字符串。
    你传递了什么编码名称,就用什么编码规定去解析这个字符串数组。
    然后再返回给你一个以java VM编码格式编码的String对象。
      

  5.   

    朴素的和LZ说,你说byte都是8位的,charsetName是个16位的编码方法,那我两位两位编码总可以吧?byte[]数组就是这个String的"数据",charsetName指定以什么方式去解析这一串二进制
      

  6.   

    charsetName指定了这个给定的byte数组应该按照什么编码方式还原成字符串
    假定bytes是一个长度为12的数组,
    比如charset若指定为UTF-16编码,JVM会把这个byte[12]转换成长度为6的一个String
    charset若指定为ISO编码,JVM会把这个byte[12]转换成长度为12的一个String
    charset若指定为UTF-8编码,JVM会把这个byte[12]转换成长度为4~12的一个String重点是: 得到的字符串长度未必等于byte[]的长度
      

  7.   


    public String(byte[] bytes,
                  String charsetName)
           throws UnsupportedEncodingException通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于 byte 数组的长度。 
    当给定 byte 在给定字符集中无效的情况下,此构造方法的行为没有指定。如果需要对解码过程进行更多控制,则应该使用 CharsetDecoder 类。 
    参数:
    bytes - 要解码为字符的 byte
    charsetName - 受支持的 charset 的名称 
    抛出: 
    UnsupportedEncodingException - 如果指定字符集不受支持
    不太明白 楼主的意思