我刚才写程序遇到一个问题,可能很菜,希望能得到指点:我在写一个文本转码程序。中文转码都没有问题,但是遇到空格的时候却输出错误了,就是在输出空格的时候。下面举个例子:byte[] b=new byte[1];
b[0]=0x20;//空格
String str=new String(b, "UTF-16");
System.out.println(str);控制台输出却输出了个“口”字。
把这个字符串写到文件里发现写的数据是:EF BF BD
请问这是怎么回事?

解决方案 »

  1.   

    因为我的原始编码是\uFFFF这样的,所以必须按照UTF-16的方式来转码。不能使用UTF-8的
      

  2.   


    String str = new String(b, "ISO-8859-1");
    byte[] b=new byte[1];
    b[0]=0x20;//空格byte数组里面的元素的编码方式符合iso-8859-1格式
      

  3.   

    那就要用\uFFFF的写法啊,
    System.out.println("\u0020");
      

  4.   


    如你所说,使用iso-8859-1格式,则无法转中文,我做这个程序就是为了转中文,现在卡到了“空格”这里。
      

  5.   

    比方说 \u9177 对应汉字“酷”,我已经取出了
    byte[] b=new byte[2];
    b[0]=(byte)0x91;
    b[1]=0x77;
    我用new String(b, "UTF-16")没有任何问题。但是到空格也就是\u0020就出问题了。
      

  6.   

    UTF-16是用4个字节保存多字节数据的,所以你只有一个字节,无法转成对应的多字节字符,估计剩余的3个字节会自动补长,得到一个乱码字符
    byte[] b=new byte[1];
    b[0]=0x20;//空格
    String str=new String(b, "UTF-16");
    System.out.println(str);
    b = str.getBytes("UTF-16"); //重新获得字符串的字节
    System.out.println(b.length); //看看长度是否变了
    for (int i=0; i<b.length; i++) { //看看每个字节都是什么
        System.out.printf("%04x\n", b[i]);
    }
    UTF-8是变长字节,会根据编码范围自动调节,所以得到的是正确信息
      

  7.   

    比较一下每种编码的长度和字节信息String str = " ";
    byte[] b = str.getBytes("UTF-16"); //四个字节
    System.out.println(b.length);
    for (int i=0; i<b.length; i++) { //前2个字节是0xfe 0xff,后2个字节是 0x00 0x20
        System.out.printf("%04x\n", b[i]);
    }b = str.getBytes("UTF-8"); //变长字节
    System.out.println(b.length);
    for (int i=0; i<b.length; i++) { //只有1个字节,就是 0x20
        System.out.printf("%04x\n", b[i]);
    }b = str.getBytes("UTF-16BE"); //双字节
    System.out.println(b.length);
    for (int i=0; i<b.length; i++) { //有两个字节,分别是 0x00 0x20
        System.out.printf("%04x\n", b[i]);
    }所以你只输入一个字节,用UTF-16或UTF-16BE都会自动补长,UTF-8保持原来长度
      

  8.   


    原来是\uFFFF这样,不应该用unicode来转换吗new String(b,"unicode");
      

  9.   


    感谢qybao的回答,确实是这样的,不过小弟在此要修正一下,UTF-16最小的存储单元是2字节而不是四字节。UTF-32是4个字节。以前我曾经写过一篇专门研究编码的文章,不过今天还是挂在了编码问题上另外我写了另外一种处理方法:
    unicodeStr="9177";
    int unicode= Integer.parseInt(unicodeStr, 16);
    String unicodeString= String.valueOf((char)unicode);
    也是可以的。
    现在想想,和qy宝的说明是异曲同工的。因为int类型始终使用4字节。即便是0x20这样的数据,到内存里仍然会变成0x00000020,所以不会出错。结贴
      

  10.   

    String str = " ";
    byte[] b = str.getBytes("UTF-16"); //四个字节
    这里实际上空格字符只占用了2个字节,
    开头的fe、ff是UTF-16的BOM,后面的00 20 才是空格所占用的。