JAVA 及PYTHON汉字和UTF8编码问题

时间:2023-01-05 09:33:32

String str = "你好吗";
System.out.println(str);
String str1 = new String(str.getBytes("utf8"));
System.out.println(str1);

str1 = new String(str1.getBytes("GBK"));
System.out.println(str1);

你好吗
浣犲ソ鍚
娴g姴銈介崥锟�

疑问:汉字转成了UTF8,怎么转不回来了啊??
另外我是要把中文STRING转成UTF8然后发给PYTHON.
用JAVA把中文"你好吗"转成UTF8是:浣犲ソ鍚
变成十六进制是:\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90
用PYTHON把中文"你好吗"转成UTF8是:'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97'
为什么会不一样呢?好奇怪.请朋友和前辈们帮看一下啊.快崩溃了..

6 个解决方案

#1


JAVA里都是UNICODE编码。
UTF-8 每个汉字是3个字节,你转的少了一个,是你代码的问题。

看我的代码
  public static void main(String args[]) throws UnsupportedEncodingException {
    String str = "你好吗";
    System.out.println(str);
    byte[] bs = str.getBytes("utf-8");
    System.out.println(bs.length);
    String str1 = new String(bs);
    System.out.println(str1);
    str1 = new String(str1.getBytes(),"utf-8");
    System.out.println(str1);
    str1 = new String(bs,"utf-8");
    System.out.println(str1);
  }


三个汉字转为byte是9个,你又非得重新组合成unicode的字符串,2个算1个,等于4个字符,无形中丢了一个啦!

#2


你把
String str = "你好吗吗";

双数的字符,看得就更清楚了。 真凑巧,双数转化后为12个字节,拼成了6个字符。你再转回去依然是对的。

哈哈! 不过可不能这么干哦!

#3


不一样是因为平台的默认charset不同吧

String str1 = new String(str.getBytes("utf8"));

使用的是平台默认的charset来解码

String str1 = new String(str1.getBytes("utf8"),"utf-8");

手工指定解码方式汉字就不乱码了
        

#4


实在感谢这位前辈啊.

但在下刚才想了,也实在不知道怎么解决这个问题啊.单数的字符总不可能避免啊

#5


问题在于,你千万不要把byte[] 再转化为String 啦!

直接用byte[] 发送不就行了。

如果嫌麻烦,把byte[]Base64编码后,以字符串的方式发过去也行。

另外,这段代码也许你用得着
  public static String byteToString(byte[] bs) {
    byte high, low;
    byte maskHigh = (byte) 0xf0;
    byte maskLow = 0x0f;
    StringBuffer buf = new StringBuffer();
    for (byte b : bs) {
      high = (byte) ((b & maskHigh) >> 4);
      low = (byte) (b & maskLow);
      buf.append(findHex(high));
      buf.append(findHex(low));
    }
    return buf.toString();
  }

#6


感谢谢前辈.问题终于解决了.

#1


JAVA里都是UNICODE编码。
UTF-8 每个汉字是3个字节,你转的少了一个,是你代码的问题。

看我的代码
  public static void main(String args[]) throws UnsupportedEncodingException {
    String str = "你好吗";
    System.out.println(str);
    byte[] bs = str.getBytes("utf-8");
    System.out.println(bs.length);
    String str1 = new String(bs);
    System.out.println(str1);
    str1 = new String(str1.getBytes(),"utf-8");
    System.out.println(str1);
    str1 = new String(bs,"utf-8");
    System.out.println(str1);
  }


三个汉字转为byte是9个,你又非得重新组合成unicode的字符串,2个算1个,等于4个字符,无形中丢了一个啦!

#2


你把
String str = "你好吗吗";

双数的字符,看得就更清楚了。 真凑巧,双数转化后为12个字节,拼成了6个字符。你再转回去依然是对的。

哈哈! 不过可不能这么干哦!

#3


不一样是因为平台的默认charset不同吧

String str1 = new String(str.getBytes("utf8"));

使用的是平台默认的charset来解码

String str1 = new String(str1.getBytes("utf8"),"utf-8");

手工指定解码方式汉字就不乱码了
        

#4


实在感谢这位前辈啊.

但在下刚才想了,也实在不知道怎么解决这个问题啊.单数的字符总不可能避免啊

#5


问题在于,你千万不要把byte[] 再转化为String 啦!

直接用byte[] 发送不就行了。

如果嫌麻烦,把byte[]Base64编码后,以字符串的方式发过去也行。

另外,这段代码也许你用得着
  public static String byteToString(byte[] bs) {
    byte high, low;
    byte maskHigh = (byte) 0xf0;
    byte maskLow = 0x0f;
    StringBuffer buf = new StringBuffer();
    for (byte b : bs) {
      high = (byte) ((b & maskHigh) >> 4);
      low = (byte) (b & maskLow);
      buf.append(findHex(high));
      buf.append(findHex(low));
    }
    return buf.toString();
  }

#6


感谢谢前辈.问题终于解决了.