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中有关Null的9问题
- 在C++中反射调用.NET(二) 定义数据接口 绑定委托方法 使用SOD DTO 对象 将.NET对象转换到C++结构体为何不使用序列化的问题
- Java阻塞队列线程集控制的实现方法
- 【自然框架】QuickPager分页控件,新增一种分页方式——伪URL分页(Postback版)
- 我们的漏洞Webug 3.0中级进阶攻略(上)
- 【自然框架】QuickPager分页控件的总体介绍和在线演示
- 在C++中反射调用.NET(三) 使用非泛型集合的委托方法C++中的列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++/CLI
- 如何使用树莓派自制网络监视器
- 利用雅虎小型企业服务平台的目录遍历漏洞查看客户的信用卡信息
- 【自然框架】QuickPager asp.net 分页控件的Ajax分页方式。
- 骑行在华盛顿 针对320万次共享单车骑行数据的分析
- 【自然框架】QuickPagerSQL——专门生成分页用的SQL的类库
- 【数据科学】数据科学中的 Spark 入门
- 【自然框架】QuickPager分页控件的单独的源码 V2.0.4.2。
- 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 文档注释
- 神经网络架构搜索——二值可微分搜索(BATS)
- UEFI 原理与编程 1 - UEFI开发环境EDK2搭建
- 【Unity】瞎做个宝石迷阵吧!(1)——构建场景
- VUE组件传值案例讲解
- 【JAVA】来写个JAVA的HelloWorld吧!
- 如何发布自己的项目到Maven中央仓库?
- 《闲扯Redis八》Redis字典的哈希表执行Rehash过程分析
- 为什么说在Android中请求权限从来都不是一件简单的事情?
- 小知识:如何赋予用户查看所有存储过程和触发器的权限
- ZCU106使用VCU TRD的MIPI的例子
- 一款功能简约到可怜的SQL 客户端
- Kotlin---data class
- sqlmap的使用方法
- 从0开始做播放器---音频播放有杂音且音调异常
- 线上故障实录-一大早服务就不可用了?