我刚才写程序遇到一个问题,可能很菜,希望能得到指点:我在写一个文本转码程序。中文转码都没有问题,但是遇到空格的时候却输出错误了,就是在输出空格的时候。下面举个例子:byte[] b=new byte[1];
b[0]=0x20;//空格
String str=new String(b, "UTF-16");
System.out.println(str);控制台输出却输出了个“口”字。
把这个字符串写到文件里发现写的数据是:EF BF BD
请问这是怎么回事?
b[0]=0x20;//空格
String str=new String(b, "UTF-16");
System.out.println(str);控制台输出却输出了个“口”字。
把这个字符串写到文件里发现写的数据是:EF BF BD
请问这是怎么回事?
解决方案 »
- 怎么查看一个函数的返回值类型
- 大家可以到这里下载火狐浏览器,很安全,快速的上网
- SwingSet3尝鲜
- JAVA输入流问题
- awt组件下,关闭窗口的命令怎么写?比如关掉一个frame
- 请教一下关于异常处理的问题
- 关于 JPasswordField?
- Design patterns, elements of reusable software
- 请问各位,
- 一表单有一"Reset"按钮,当单击它时显示confirm对话框,点"确定",清除所填内容,单击"取消",不清除所填内容,该怎么做?
- 请教大家一个OOP编程问题,谢谢各位
- Java中 有没有类似于 Js中的 Interval 的方法,或者setTimeout
String str = new String(b, "ISO-8859-1");
byte[] b=new byte[1];
b[0]=0x20;//空格byte数组里面的元素的编码方式符合iso-8859-1格式
System.out.println("\u0020");
如你所说,使用iso-8859-1格式,则无法转中文,我做这个程序就是为了转中文,现在卡到了“空格”这里。
byte[] b=new byte[2];
b[0]=(byte)0x91;
b[1]=0x77;
我用new String(b, "UTF-16")没有任何问题。但是到空格也就是\u0020就出问题了。
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是变长字节,会根据编码范围自动调节,所以得到的是正确信息
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保持原来长度
原来是\uFFFF这样,不应该用unicode来转换吗new String(b,"unicode");
感谢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,所以不会出错。结贴
byte[] b = str.getBytes("UTF-16"); //四个字节
这里实际上空格字符只占用了2个字节,
开头的fe、ff是UTF-16的BOM,后面的00 20 才是空格所占用的。