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

jy02411368 2015-06-27 11:17:24
直接看代码 这是一个例子
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抓包时发现有乱码的 这里只是一个例子但意思应该都相同 想看看这里有没有高手能解决的
...全文
1145 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
soton_dolphin 2017-07-11
  • 打赏
  • 举报
回复

		String s = "111aaa啊啊啊";
		byte[] b = s.getBytes();
		
		BufferedReader br = new BufferedReader(new InputStreamReader( new ByteArrayInputStream(b)));
	
		String line = br.readLine();
chong56927 2017-07-11
  • 打赏
  • 举报
回复
我现在做的东西跟楼主的一样,不知道楼主的问题解决了没有?
三仙半 2015-06-30
  • 打赏
  • 举报
回复
JPCAP没搞过,这是啥情况我就不知道了。
jy02411368 2015-06-29
  • 打赏
  • 举报
回复
引用 9 楼 zys59 的回复:
不知道你的那个字节数组是从哪里来的,估计是从外部传入的吧?不过,无论如何你必须知道是才用的哪种编码,否则,真的是没法转换啊。
你好 不好意思是我搞错了。你的答案是对的。但是放在我的代码里面 确实还是显示乱码 。因为我是去抓服务器的数据包 之前这一部分是乱码 但是现在使用了你的方法给的结果是 :綖 肵蚺顧膵跒ソ捍玃醴鵼戽滹㈩ɑ蘡狩跼亹貲瑉穇氦卍騲綊嗬馷冿溸机甜佸遯绮凄没醝鮨瓰齏鋇盗黎颙锿臾閻澌緉鈑そ掚瑼誙鍭疻娂啕岽玸嫆り荺損狕縖鈼隓闬癊ざ砝钮啉矞襟狠茽喀娜诠鸣璓晛攛吢笩绹噤癏筚 这只是其中一段 之前是乱码 现在经过你的方法 没错是给了中文。。但是很明显也不是我想要的 我贴一下代码 希望能够得到你的指点 使用了JPCAP技术 获取到了链路层的数据packet.DATA public class T1 implements PacketReceiver{ public void receivePacket(Packet packet) { try{ Packet p = packet; if(p.data.length>0||p.data!=null){ if(p instanceof UDPPacket){ UDPPacket up = (UDPPacket)p; byte[] d = up.data; String line = new String(d,"UTF-8"); System.out.println("UDP:\r\n"+line); }else if(p instanceof IPPacket){ IPPacket ip = (IPPacket)p; byte[] d = ip.data; StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < ip.data.length; i++) { byte b = ip.data[i]; if (b >= 0) { stringBuffer.append((char) b); } else { byte[] tmp = new byte[2]; tmp[0] = b; tmp[1] = ip.data[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()); } else if(p instanceof TCPPacket){ TCPPacket tcp = (TCPPacket)p; byte[] d = tcp.data; String line = new String(d,"UTF-8"); System.out.println("TCP:\r\n"+line); }else if(p instanceof ARPPacket){ ARPPacket ap = (ARPPacket)p; byte[] d = ap.data; String line = new String(d,"UTF-8"); System.out.println("ARP:\r\n"+line); }else{ System.out.println(false); } System.out.println("--------------------------------------------------------------"); } }catch(Exception e){ e.printStackTrace(); } } }
jy02411368 2015-06-29
  • 打赏
  • 举报
回复
引用 9 楼 zys59 的回复:
不知道你的那个字节数组是从哪里来的,估计是从外部传入的吧?不过,无论如何你必须知道是才用的哪种编码,否则,真的是没法转换啊。
这个字节数组是我从链路层抓出来的TCP数据包。所以编码我肯定是不知道。UTF-8 GBK都有尝试 都不行。并且我看了你下面写的那个例子 直接是报java.nio.charset.MalformedInputException: Input length = 2 java.nio.charset.MalformedInputException: Input length = 1异常的
scmod 2015-06-29
  • 打赏
  • 举报
回复
不是有charAt么?
三仙半 2015-06-28
  • 打赏
  • 举报
回复
这是我实验的代码,真的什么意义都没有!!

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());
	}
三仙半 2015-06-28
  • 打赏
  • 举报
回复
不知道你的那个字节数组是从哪里来的,估计是从外部传入的吧?不过,无论如何你必须知道是才用的哪种编码,否则,真的是没法转换啊。
jy02411368 2015-06-27
  • 打赏
  • 举报
回复
引用 6 楼 zys59 的回复:
ASCII编码能表示128个字符,它的首位恒为0,而双字节编码的首位恒为1。据此,你依次判断字节,大于127的,就把该字节和下一个字节作为一个字符处理,并在循环中,跳过下一个字节。不知道我说明白没有。
这个我试过了意思明白 但是实验失败。上面我发的问题里面也说了
jy02411368 2015-06-27
  • 打赏
  • 举报
回复
引用 5 楼 qq_26485181 的回复:
[quote=引用 4 楼 jy02411368 的回复:] 3L的哥们说的没错。你给的办法也是对的 但是我现在条件必须是将这个byte中的80-95 转为char并且打印出对应的中文。因为我接收到的就是BYTE[80-95] 并且服务器端没有商量的余地 估计懂的人能看明白

// byte转char

private char[] getChars (byte[] bytes) {
      Charset cs = Charset.forName ("UTF-8");
      ByteBuffer bb = ByteBuffer.allocate (bytes.length);
      bb.put (bytes);
                 bb.flip ();
       CharBuffer cb = cs.decode (bb);
  
   return cb.array();
}
网上找来的,用ByteBuffer和CharBuffer来做的,楼主可以试试[/quote]这个方法试过了 不可行的 首先上面的编码并不能改变操作系统的编码 而是改变了此程序在运行时的编码 其实跟没用一个样 然后这个是转换整个BYTE[] 完了还是乱码 不可行
三仙半 2015-06-27
  • 打赏
  • 举报
回复
ASCII编码能表示128个字符,它的首位恒为0,而双字节编码的首位恒为1。据此,你依次判断字节,大于127的,就把该字节和下一个字节作为一个字符处理,并在循环中,跳过下一个字节。不知道我说明白没有。
qq_26485181 2015-06-27
  • 打赏
  • 举报
回复
引用 4 楼 jy02411368 的回复:
3L的哥们说的没错。你给的办法也是对的 但是我现在条件必须是将这个byte中的80-95 转为char并且打印出对应的中文。因为我接收到的就是BYTE[80-95] 并且服务器端没有商量的余地 估计懂的人能看明白

// byte转char

private char[] getChars (byte[] bytes) {
      Charset cs = Charset.forName ("UTF-8");
      ByteBuffer bb = ByteBuffer.allocate (bytes.length);
      bb.put (bytes);
                 bb.flip ();
       CharBuffer cb = cs.decode (bb);
  
   return cb.array();
}
网上找来的,用ByteBuffer和CharBuffer来做的,楼主可以试试
jy02411368 2015-06-27
  • 打赏
  • 举报
回复
3L的哥们说的没错。你给的办法也是对的 但是我现在条件必须是将这个byte中的80-95 转为char并且打印出对应的中文。因为我接收到的就是BYTE[80-95] 并且服务器端没有商量的余地 估计懂的人能看明白
qq_26485181 2015-06-27
  • 打赏
  • 举报
回复
引用 2 楼 qq_26485181 的回复:

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就不知道了。
Java用的是16位的Unicode,应该是可以转成Char的。 查下文档Character类的Api看有没有类似于上面String的用法?
qq_26485181 2015-06-27
  • 打赏
  • 举报
回复

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就不知道了。
alan19931103 2015-06-27
  • 打赏
  • 举报
回复
汉字是两个字节的,所以单字节不能转化为汉字

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧