偶然在写代码中,遇到String字符串里面存在非常多的16进制数据,如下图,需要将红框中的十六进制数据转换为对应的汉字,方便阅读。
采用的逻辑思路为,正则表达式匹配出所有的十六进制数据,然后进行转换为汉字,转换成功以后,用汉字替换相应的十六进制数据,然后再转换为String字符串,具体代码见下图
/** * utf-8十六进制编码为汉字 * */ public static String hexToString(String str) { Pattern pattern = Pattern.compile("(\\\\\\\\x[0-9A-Fa-f]{2})+"); Matcher matcher = pattern.matcher(str); Map<String,String> result = new TreeMap<>(); List<String> listKey = new LinkedList<>(); while (matcher.find()) { String group = matcher.group(0); String groupReplace = group.replaceAll("\\\\\\\\x", ""); byte[] b = new byte[groupReplace.length() / 2];// 每两个字符为一个十六进制确定数字长度 for (int i = 0; i < b.length; i++) { // 将字符串每两个字符做为一个十六进制进行截取 String a = groupReplace.substring(i * 2, i * 2 + 2); b[i] = (byte) Integer.parseInt(a, 16);// 将如e4转成十六进制字节,放入数组 } try { // 将字节数字以utf-8编码以字符串形式输出 String ccc = new String(b, "UTF-8"); result.put(ccc,group); listKey.add(ccc); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } if(listKey != null && listKey.size() > 0){ listKey.sort(Comparator.reverseOrder()); for (String key : listKey ) { String value = result.get(key); str = str.replace(value, key); } } return str; }
/** * Unicode转 汉字字符串 * * @param str * \u6728 * @return '木' 26408 */ public static String unicodeToString(String str) { Pattern pattern = Pattern.compile("(\\\\\\\\u(\\p{XDigit}{4}))"); Matcher matcher = pattern.matcher(str); char ch; while (matcher.find()) { // group 6728 String group = matcher.group(2); // ch:'木' 26408 ch = (char) Integer.parseInt(group, 16); // group1 \u6728 String group1 = matcher.group(1); str = str.replace(group1, ch + ""); } return str; }
测试数据及结果如下图