java 中 16 进制 HEX 转换成字节码形式的 UTF-8
恩,又碰到个蛋疼的编码转换问题了:要把形如 xE9xBB 的字符串转成中文。。。
在python中我们直接 print "xE9xBBx84" 即可,
在shell中我们直接 echo $'xe9xbbx84' #echo -e 'xe9xbbx84'也行,
注意:不能直接 echo $'xdexab'|iconv -f gbk -t utf-8 ,
因为 gbk的话,xE9xBB是榛,后面的x84只有半个字,会报错或乱码,
utf8是变长的,占1~4字节,汉字一般是3字节,例如 xe9是16进制,占8bit,也就是一个字节。
但是到了 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"));
}
}
结果:
xe4xb8xadxe5x9bxbdx31x61x32x33
中国1a23
黄花梨家具转让
下面再来看看 unicode 形式怎么在 java 中转换:
String string = "中国u6211u7231u5317u4EAC";
byte[] utf8 = string.getBytes("UTF-8");
string = new String(utf8, "UTF-8");
System.out.println(string);
在 shell 中:
echo -e \u4f60 #注意 type -a echo; which echo; man bash 版本是否支持 uHHHH 4 字节 unicode。
perl -CS -le 'print "x{4f60}"'
python -c 'print u"u4f60"'
REF:
java中byte 与16进制字符相互转换
http://marshzg.iteye.com/blog/722260
shell 下 urlencode/urldecode 编码/解码的几种方法
http://hi.baidu.com/leejun_2005/item/9e0f4e4ba62cde0bc11613b5
java: utf-8 与 unicode 互转
http://www.360doc.com/content/08/0421/16/21290_1206154.shtml
Converting A String To Hexadecimal In Java
http://stackoverflow.com/questions/923863/converting-a-string-to-hexadecimal-in-java
Convert from byte array to hex string in java
http://stackoverflow.com/questions/9655181/convert-from-byte-array-to-hex-string-in-java
推荐阅读:
深度剖析Java的字符编码
http://geeklu.com/2009/12/dive-into-the-charset-of-java/
java中byte转换int时为何与0xff进行与运算
http://blogread.cn/it/article/6302?f=wb
- Java面向对象抽象类案例分析
- 【Java学习笔记之二十三】instanceof运算符的用法小结
- 基础才是重中之重~多线程的代价~我的内存都被吃了!
- 【Java学习笔记之二十八】深入了解Java8新特性
- 【Java学习笔记之二十四】对Java多态性的一点理解
- 【Java学习笔记之二十六】深入理解Java匿名内部类
- 【Java学习笔记之二十五】初步认知Java内部类
- AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)
- 【Java学习笔记之三十】详解Java单例(Singleton)模式
- 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案
- 浅析ASCII、Unicode和UTF-8三种常见字符编码
- 【Java学习笔记之三十一】详解Java8 lambda表达式
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
- 【Code】关关的刷题日记21——Leetcode 485. Max Consecutive Ones
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 性能优化漫谈(一):无代码调优
- C++职责链模式
- Newbe.Claptrap 框架入门,第四步 —— 利用 Minion,商品下单
- 使用 NextCloud + COS 搭建个人网盘
- Shader基础技巧整理
- 隐秘的物理粒子系统与渲染 !Cocos Creator LiquidFun !
- 一起用Gradle Transform API + ASM完成代码织入呀~
- 掩盖浏览痕迹不会被发现的方法【逗】
- webpack实战——样式预处理
- 前端防止浏览器访问旧版 js 和 css 的优化思路
- 少数派实测报告:AI巨无霸模型GPT-3 | 附送API 调用方法「AI核心算法」
- Qt音视频开发19-海康sdk录像存储
- 单元测试在深度学习中的应用 | 附代码「AI产品/工程落地」
- 实现 AOP 的三种方式
- Spring Boot 配置