消息关闭
    暂无新消息!

java byte转char 中文乱码~不是byte[]

问题作者 : 滚死树2017-07-11发布
直接看代码 这是一个例子
public static void main(String[] args){
String s = "111aaa啊啊啊";
byte[] b = s.getBytes();
for(int i=0;i<b.length;i++){
byte a = b[i];
char c= (char) a;
System.out.print(a);
}
}
输出之后是494949979797-80-95-80-95-80-95
如果输出C 则结果是111aaa??????
可以看到1代表49  a代表97  而80-95代表一个汉字 但程序无法解析这个4位的汉字 请问怎么样才能将单个byte转为汉字的char?据我所知char是可以容纳一个汉字的  但是这里强制转换之后 汉字是乱码 说明在转换的过程中 程序是按照XX两个数字等于一个字符来转换 遇到XX-XX 也是拆开以XX两位的来转换 所以出现乱码   这个问题是我在做jpcap抓包时发现有乱码的 这里只是一个例子但意思应该都相同 想看看这里有没有高手能解决的

10个回答

︿ 3
3L的哥们说的没错。你给的办法也是对的 但是我现在条件必须是将这个byte中的80-95 转为char并且打印出对应的中文。因为我接收到的就是BYTE[80-95] 并且服务器端没有商量的余地 估计懂的人能看明白
︿ 2

byte []b=s.getBytes("ISO-8859-1");
for(int i=0;i<b.length;i++){
byte a = b[i];
System.out.println(a);
}
String c=new String(b,"UTF-8");
System.out.print(c);

把byte转换成String可以这么做,转成Char就不知道了。
︿ 1
我现在做的东西跟楼主的一样,不知道楼主的问题解决了没有?
︿ 1
这是我实验的代码,真的什么意义都没有!!

public static void main(String[] args) {
String str = "111aaa啊啊啊";
//实际应用中这个是从外部获得的,必须知道对方用的什么编码!!
byte[] bytes = str.getBytes();
// String res = new String(bytes);
// System.out.println(res);

//下面这段代码是从JDK源码里面分离出来的,去掉了关于字符串编码方面的判断
//其实什么意义都没有!!
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
byte b = bytes[i];
if (b >= 0) {
stringBuffer.append((char) b);
} else {//这个部分是在把中文字符的编码转换成字符
byte[] tmp = new byte[2];
tmp[0] = b;
tmp[1] = bytes[i + 1];
Charset cs = Charset.defaultCharset();
ByteBuffer byteBuffer = ByteBuffer.wrap(tmp);
CharsetDecoder decoder = cs.newDecoder();
try {
CharBuffer charBuffer = decoder.decode(byteBuffer);
char ch = charBuffer.get();
System.out.println(ch);
stringBuffer.append(ch);
} catch (CharacterCodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
}
}
System.out.println(stringBuffer.toString());
}
︿ 0
不知道你的那个字节数组是从哪里来的,估计是从外部传入的吧?不过,无论如何你必须知道是才用的哪种编码,否则,真的是没法转换啊。
︿ 0
ASCII编码能表示128个字符,它的首位恒为0,而双字节编码的首位恒为1。据此,你依次判断字节,大于127的,就把该字节和下一个字节作为一个字符处理,并在循环中,跳过下一个字节。不知道我说明白没有。
︿ 0

String s = "111aaa啊啊啊";
byte[] b = s.getBytes();

BufferedReader br = new BufferedReader(new InputStreamReader( new ByteArrayInputStream(b)));

String line = br.readLine();