微信搜索lxw1234bigdata | 邀请体验:数阅–数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

java 中 16 进制 HEX 中文解码

编程语言 lxw1234@qq.com 10608℃ 0评论

Mark一下。

对于“\xE4\xBD\xBF\xE5\xBE\x92\xE8\xA1\x8C\xE8\x80\x85”这种编码格式的中文,shell中直接使用echo -e “\xE4\xBD\xBF\xE5\xBE\x92\xE8\xA1\x8C\xE8\x80\x85″即可得到中文,java中比较麻烦:

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;

public class Test {

	public static String str2Hex(String str) throws UnsupportedEncodingException {
		String hexRaw = String.format("%x", new BigInteger(1, str.getBytes("UTF-8")));
		char[] hexRawArr = hexRaw.toCharArray();
		StringBuilder hexFmtStr = new StringBuilder();
		final String SEP = "\\x";
		for (int i = 0; i < hexRawArr.length; i++) {
			hexFmtStr.append(SEP).append(hexRawArr[i]).append(hexRawArr[++i]);
		}
		return hexFmtStr.toString();
	}

	public static String hex2Str(String str) throws UnsupportedEncodingException {
		String strArr[] = str.split("\\\\"); // 分割拿到形如 xE9 的16进制数据
		byte[] byteArr = new byte[strArr.length - 1];
		for (int i = 1; i < strArr.length; i++) {
			Integer hexInt = Integer.decode("0" + strArr[i]);
			byteArr[i - 1] = hexInt.byteValue();
		}

		return new String(byteArr, "UTF-8");
	}

	public static void main(String[] args) throws UnsupportedEncodingException {

		System.out.println(str2Hex("中国1a23"));
		System.out.println(hex2Str(str2Hex("中国1a23")));
		System.out.println(hex2Str("\\xE9\\xBB\\x84\\xE8\\x8A\\xB1\\xE6\\xA2\\xA8\\xE5\\xAE\\xB6\\xE5\\x85\\xB7\\xE8\\xBD\\xAC\\xE8\\xAE\\xA9"));
	}

}

补充一个,对于16进制和非16进制混合的情况:

String str = "\\xE6\\x97\\xB6\\xE8\\xA3\\x85__aaaaa\\xE4\\xBD\\xBF\\xE5\\xBE\\x92\\xE8\\xA1\\x8C\\xE8\\x80\\x85";
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		for(int i=0; i<str.length();) { 			if(str.substring(i).startsWith("\\x")) { 				String s = str.substring(i + 2, i + 4); //				System.out.println("--->" + s);
				baos.write(Integer.parseInt(s, 16));
				i = i + 4;
			} else {
//				System.out.println(str.substring(i,i+1));
				baos.write(str.substring(i,i+1).getBytes("utf-8"));
				i++;
			}
		}
		byte[] bytes = baos.toByteArray();
	    String decoded = new String(bytes, "utf-8");
	    System.out.println(decoded);

输出:
时装__aaaaa使徒行者

 

参考:https://my.oschina.net/leejun2005/blog/106791

如果觉得本博客对您有帮助,请 赞助作者

转载请注明:lxw的大数据田地 » java 中 16 进制 HEX 中文解码

喜欢 (3)
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址