String str = "中国";
    try {
     byte[] b = str.getBytes("UTF-8");
System.out.println("getBytes =" + b.length);
System.out.println("str = " + new String(b,"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}1.为什么 加“utf-8”,输出 字节数组长度为6,不加时为 4.
2.默认的字符集是什么,该怎样查看默认字符集
3.如果把“utf-8”改成ascii ,那还能转换回原来的中文吗。 ? 说下标准理由吧。

解决方案 »

  1.   

    1.加UTF-8就是把字符串按照UTF-8的编码进行解码,在UTF-8中一个汉字要用3个字节来存储的
    不加时为4是因为不加时它按照默认的字符编码来进行解码,而中文的操作系统默认的字符编码
    一般是GBK,在GBK编码中一个汉字是占2个字节的
    2.要查看当前Java虚拟机使用的默认字符集,可以这样做System.out.println(Charset.defaultCharset());3.不能转换回中文,ascii字符集里只有英文,没有中文
      

  2.   


    如果 str = “中国人” , 输出长度为8 。 你的“在UTF-8中一个汉字要用3个字节来存储的” 不怎么对哦。
      

  3.   

    1.为什么 加“utf-8”,输出 字节数组长度为6,不加时为 4.
    因为默认的字符集是utf-16
    2.默认的字符集是什么,该怎样查看默认字符集
    默认的字符集是utf-16
    在api里有说明
    char Charater String都是UTF-16编码
    3.如果把“utf-8”改成ascii ,那还能转换回原来的中文吗。 ? 说下标准理由吧。
    能转回中文,只要得到byte数组用的字符集和转回用的是同一个字符集,转回后在系统的UTF-16字符集中还是原来的中文。
      

  4.   

    java.lang 
    类 Character
    ...
    Unicode 字符表示形式
    char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体。Unicode 标准曾做过修改,以允许那些其表示形式需要超过 16 位的字符。合法代码点 的范围现在是从 U+0000 到 U+10FFFF,即通常所说的 Unicode 标量值。(请参阅 Unicode 标准中 U+n 表示法的定义。) 从 U+0000 到 U+FFFF 的字符集有时也称为 Basic Multilingual Plane (BMP)。代码点大于 U+FFFF 的字符称为增补字符。Java 2 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。 因为UTF8是以8bits即1Bytes为编码的最基本单位的变长编码,中文一般在2到4byte
      

  5.   

    java.lang 
    类 Character
    ...
    Unicode 字符表示形式
    char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体。Unicode 标准曾做过修改,以允许那些其表示形式需要超过 16 位的字符。合法代码点 的范围现在是从 U+0000 到 U+10FFFF,即通常所说的 Unicode 标量值。(请参阅 Unicode 标准中 U+n 表示法的定义。) 从 U+0000 到 U+FFFF 的字符集有时也称为 Basic Multilingual Plane (BMP)。代码点大于 U+FFFF 的字符称为增补字符。Java 2 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。 因为UTF8是以8bits即1Bytes为编码的最基本单位的变长编码,中文一般在2到4byte
      

  6.   

    字符在UTF-8的编码中占的字节数是不固定的,一个英文字符只占一个字节,一个汉字最少要2个字节,多的就要3个字节
      

  7.   

    第二个问题,一楼说的对,我理解错了,默认字符集用于String.getByte()方法(省略字符集参数即用系统默认字符集)
      

  8.   

    Charset
    defaultCharset
    public static Charset defaultCharset()返回此 Java 虚拟机的默认 charset。 
    默认 charset 在虚拟机启动时决定,通常根据语言环境和底层操作系统的 charset 来确定。 
      

  9.   

    你的“在UTF-8中一个汉字要用3个字节来存储的” 不怎么对哦。 并不是每个汉字都会用三个字节。中国人 只打印8 是因为 人字是用两个字节。你看看utf 是怎么编码的就知道怎么回事了。有些生僻的中文可能会用四个字节。
      

  10.   

    是喔,1L的正确,JVM是看本机编码格式的
      

  11.   

    我也知道utf-8的中文一般是3个字节,但不知道什么情况下是2个字节或者4个字节,没研究过原理。
      

  12.   

    中国人是9吧,UTF-8的话。
    UTF-8中汉字是3字节,也有少量4字节。用了latin1后,信息已丢失,无法转回,中国两字符都分别对应一个字节 63 63
      

  13.   

    2楼的是对的。。中国人应该是占用getBytes =9
    楼主你打印错了吧!
      

  14.   

    中国人应该是占用getBytes =9