JAVA字符是以unicode处理,但是通过getbytes()方法,看到的是英文是一个byte而中文是三个byte
可以看出JAVA并不是使用固定长度的字节来编码的,目前我要处理一些固定2个字节16位的字节码,这些字节码在C++中可以用wchar*的方式,在java中如何能正确的转换为...
可以看出JAVA并不是使用固定长度的字节来编码的,目前我要处理一些固定2个字节16位的字节码,这些字节码在C++中可以用wchar*的方式,在java中如何能正确的转换为JAVA的编码格式,通过utf-8,utf-16,utf-32和其他的中文编码格式,都不能正确的转换,但是我通过手动删除每个字符的第二个字节码,可以转换为正确的JAVA格式,因为一些英文字等没有用到高位字节码,但是如果是用到多字节的字符就会出问题。请问是否有做过该字节码的兄弟请教一下如何转换???感激不尽,高分送上。分数还可追加。
举例:47 0 114 0 101 0 115 0 47 0 103 0 97 0 109 0 101 0 47 0 50 0 48 0 48 0 52 0 47 0 0 0
这是从流中读取的字节码了,通过JAVA转码转换为不正常字符串
手动删除高位:47 114 101 115 47 103 97 109 101 47 50 48 48 52 47
转换正确,这是在只用到一个字节的情况下 展开
举例:47 0 114 0 101 0 115 0 47 0 103 0 97 0 109 0 101 0 47 0 50 0 48 0 48 0 52 0 47 0 0 0
这是从流中读取的字节码了,通过JAVA转码转换为不正常字符串
手动删除高位:47 114 101 115 47 103 97 109 101 47 50 48 48 52 47
转换正确,这是在只用到一个字节的情况下 展开
4个回答
展开全部
字节码序列:47 114 101 115 47 103 97 109 101 47 50 48 48 52 47
表示的字符串应该是“/res/game/2004/”
在Java/C#中,将字符串转换为字节数组时,为了与其他语言兼容,一般应该将一个中文字符转换为2个字节。常见的地方:使用.NET发布Web Service,客户端使用Java访问Web Service,这里就要注意解码和编码的问题了,应该使用同一种字符集编码,否则读取会出现所谓的“中文乱码”。
再来一组测试:
public class Test30 {
public static void main(String[] args) throws Exception {
String source = "i我";
byte[] arr;
int i;
//按Java平台默认的字符集解码
arr = source.getBytes();
System.out.printf("%15s", "default : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
//按GBK(中文平台的默认字符集)字符集解码
arr = source.getBytes("GBK");
System.out.printf("%15s", "GBK : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
//按utf-8字符集解码
arr = source.getBytes("utf-8");
System.out.printf("%15s", "utf-8 : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
//按utf-16字符集解码
arr = source.getBytes("utf-16");
System.out.printf("%15s", "utf-16 : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
//按ISO-8859-1(ASCII字符集的扩展,0~255)字符集解码
arr = source.getBytes("ISO-8859-1");
System.out.printf("%15s", "ISO-8859-1 : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
}
}
测试结果:
default : 69 CE D2
GBK : 69 CE D2
utf-8 : 69 E6 88 91
utf-16 : FE FF 0 69 62 11
ISO-8859-1 : 69 3F
分析:原来GBK(还有gb2312)字符集的解码结果和Java平台的解码结果完全一致,这不是偶然,因为我的测试平台是Windowx中文平台,GBK是Java中文平台的默认字符集,一个汉字解码成为2个字节,1个字符转换为1个字节。
解决方案:如果多种语言之间需要进行编码、解码,对汉字应该按双字节处理,目前绝大多数语言都支持这种解码方案,针对Java语言,采用默认的字符集(或显示使用GBK或gb2312字符集)就可以了。
扩展:C#的默认字符集不是GBK,即使所处环境是中文平台。
表示的字符串应该是“/res/game/2004/”
在Java/C#中,将字符串转换为字节数组时,为了与其他语言兼容,一般应该将一个中文字符转换为2个字节。常见的地方:使用.NET发布Web Service,客户端使用Java访问Web Service,这里就要注意解码和编码的问题了,应该使用同一种字符集编码,否则读取会出现所谓的“中文乱码”。
再来一组测试:
public class Test30 {
public static void main(String[] args) throws Exception {
String source = "i我";
byte[] arr;
int i;
//按Java平台默认的字符集解码
arr = source.getBytes();
System.out.printf("%15s", "default : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
//按GBK(中文平台的默认字符集)字符集解码
arr = source.getBytes("GBK");
System.out.printf("%15s", "GBK : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
//按utf-8字符集解码
arr = source.getBytes("utf-8");
System.out.printf("%15s", "utf-8 : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
//按utf-16字符集解码
arr = source.getBytes("utf-16");
System.out.printf("%15s", "utf-16 : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
//按ISO-8859-1(ASCII字符集的扩展,0~255)字符集解码
arr = source.getBytes("ISO-8859-1");
System.out.printf("%15s", "ISO-8859-1 : ");
for(i=0; i<arr.length; i++){
System.out.printf("%X " , arr[i]);
}
System.out.println();
}
}
测试结果:
default : 69 CE D2
GBK : 69 CE D2
utf-8 : 69 E6 88 91
utf-16 : FE FF 0 69 62 11
ISO-8859-1 : 69 3F
分析:原来GBK(还有gb2312)字符集的解码结果和Java平台的解码结果完全一致,这不是偶然,因为我的测试平台是Windowx中文平台,GBK是Java中文平台的默认字符集,一个汉字解码成为2个字节,1个字符转换为1个字节。
解决方案:如果多种语言之间需要进行编码、解码,对汉字应该按双字节处理,目前绝大多数语言都支持这种解码方案,针对Java语言,采用默认的字符集(或显示使用GBK或gb2312字符集)就可以了。
扩展:C#的默认字符集不是GBK,即使所处环境是中文平台。
展开全部
全局通过XML格式传输,包括JS也是传XML对象。
更多追问追答
追问
跟传输没关系,读取的是本地字节流文件
追答
你在得出字节流前拿到的字符串是不是就可以处理了?为什么非要等到转成字节流以后再做事。
我说用XML的意思就是从源头规避掉这些
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-03-21
展开全部
顶顶
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对这个有兴趣,研究一下。
再问一下,如是是单字节与双字节混合,这样去高位是不是会出错?
再问一下,如是是单字节与双字节混合,这样去高位是不是会出错?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询