int size = 12;
String s = "阿斯蒂芬";
byte[] b = new byte[size];
for(int i =0;i<b.length;i++)
{
b[i] = s.getBytes()[i];
}
String s1 = new String(b);
System.out.println(s1);有以上程序,测试并打印正确。若size改成非3的倍数,则该程序打印乱码。java中字符为1字节,汉字为2字节。为什么我需要定义3个字节才能解析一个字符呢?求解。
系统 windows xp 2002 service pack 3
CPU:e6600

解决方案 »

  1.   

    上述程序在我的电脑上运行失败,原因如下:
    s.getBytes() 这个函数,他在生成字节数组的时候,是按照本地默认编码来生成的,我的电脑默认编码是GBK,一个汉字占2个字节,因此s.getBytes() 返回的数组长度为8,你做循环到11,显然超出数组范围了。在楼主的电脑上,我估计默认编码为UTF-8,所以是3个字节一个汉字,如果楼主想让汉字变为2字节,很简单,指定GBK编码就行了,代码如下
    String s = "阿斯蒂芬";
    int size = 8;
    byte[] b = new byte[size];
    for (int i = 0; i < size; i++) {
    b[i] = s.getBytes(Charset.forName("GBK"))[i];
    }
    String s1 = new String(b, Charset.forName("GBK"));
    System.out.println(s1);
      

  2.   

    有以上程序,测试并打印正确。若size改成非3的倍数,则该程序打印乱码。java中字符为2字节,汉字为2字节。为什么我需要定义3个字节才能解析一个字符呢?求解。
    80%是LZ的系统编码默认是UTF8,UTF8是用3个字节来表示汉字
      

  3.   

    jvm里使用的字符是unicode编码,但转成byte[]就看特定系统了或显式指定,utf8是变长的java使用了改进的UTF8编码,和标准UTF8有所不同:第一,“null”字符((char) 0)用双字节格式编码表示而不是单字节,所以,改进版 UTF-8格式不
    会直接出现 null值。第二,改进版的 UTF-8只使用标准版 UTF-8中的单字节、双字节和三字节格式。Java虚拟机不能识别标准版 UTF-8格式定义 4字节格式,而是使用自定义的二次三字节(Two-Times-Three-Byte)格式来代替。
    至于一楼所说的\0在java中不存在
      

  4.   

    java中只是说char是两个字节的,没说所有字符,更没有说一个string里的单个字符转换成byte[]该是几个字节