java中unicode utf-8以及汉字之间的转换工具类
1. 汉字字符串与unicode之间的转换
1.1 stringToUnicode
-
/**
-
* 获取字符串的unicode编码
-
* 汉字“木”的Unicode 码点为Ox6728
-
*
-
* @param s 木
-
* @return \ufeff\u6728 \ufeff控制字符 用来表示「字节次序标记(Byte Order Mark)」不占用宽度
-
* 在java中一个char是采用unicode存储的 占用2个字节 比如 汉字木 就是 Ox6728 4bit+4bit+4bit+4bit=2字节
-
*/
-
public static String stringToUnicode(String s) {
-
try {
-
StringBuffer out = new StringBuffer("");
-
//直接获取字符串的unicode二进制
-
byte[] bytes = s.getBytes("unicode");
-
//然后将其byte转换成对应的16进制表示即可
-
for (int i = 0; i < bytes.length - 1; i += 2) {
-
out.append("\\u");
-
String str = Integer.toHexString(bytes[i + 1] & 0xff);
-
for (int j = str.length(); j < 2; j++) {
-
out.append("0");
-
}
-
String str1 = Integer.toHexString(bytes[i] & 0xff);
-
out.append(str1);
-
out.append(str);
-
}
-
return out.toString();
-
} catch (UnsupportedEncodingException e) {
-
e.printStackTrace();
-
return null;
-
}
-
}
测试
-
@Test
-
public void testGetUnicode() throws Exception {
-
String str = "木";
-
String s = EncodeUtil.stringToUnicode(str);
-
System.out.println(s); //Ox6728
-
}
1.2 unicodeToString
-
/**
-
* 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;
-
}
测试
-
@Test
-
public void testUnicodeToString() throws Exception {
-
String str = "\\u6728";
-
String s = EncodeUtil.unicodeToString(str);
-
System.out.println(s); //木
-
}
2. 汉字字符串与UTF-8之间的转换
2.1 ConvertStringToUTF8
-
/**
-
* 汉字 转换为对应的 UTF-8编码
-
* @param s 木
-
* @return E69CA8
-
*/
-
public static String convertStringToUTF8(String s) {
-
if (s == null || s.equals("")) {
-
return null;
-
}
-
StringBuffer sb = new StringBuffer();
-
try {
-
char c;
-
for (int i = 0; i < s.length(); i++) {
-
c = s.charAt(i);
-
if (c >= 0 && c <= 255) {
-
sb.append(c);
-
} else {
-
byte[] b;
-
b = Character.toString(c).getBytes("utf-8");
-
for (int j = 0; j < b.length; j++) {
-
int k = b[j];
-
//转换为unsigned integer 无符号integer
-
/*if (k < 0)
-
k += 256;*/
-
k = k < 0? k+256:k;
-
//返回整数参数的字符串表示形式 作为十六进制(base16)中的无符号整数
-
//该值以十六进制(base16)转换为ASCII数字的字符串
-
sb.append(Integer.toHexString(k).toUpperCase());
-
-
// url转置形式
-
// sb.append("%" +Integer.toHexString(k).toUpperCase());
-
}
-
}
-
}
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
return sb.toString();
-
}
测试
-
@Test
-
public void testConvertStringToUTF8() {
-
String str = "木";
-
String s = EncodeUtil.convertStringToUTF8(str);
-
System.out.println(s); //E69CA8
-
}
2.2 ConvertUTF-8ToString
-
/**
-
* UTF-8编码 转换为对应的 汉字
-
*
-
* @param s E69CA8
-
* @return 木
-
*/
-
public static String convertUTF8ToString(String s) {
-
if (s == null || s.equals("")) {
-
return null;
-
}
-
try {
-
s = s.toUpperCase();
-
int total = s.length() / 2;
-
//标识字节长度
-
int pos = 0;
-
byte[] buffer = new byte[total];
-
for (int i = 0; i < total; i++) {
-
int start = i * 2;
-
//将字符串参数解析为第二个参数指定的基数中的有符号整数。
-
buffer[i] = (byte) Integer.parseInt(s.substring(start, start + 2), 16);
-
pos++;
-
}
-
//通过使用指定的字符集解码指定的字节子阵列来构造一个新的字符串。
-
//新字符串的长度是字符集的函数,因此可能不等于子数组的长度。
-
return new String(buffer, 0, pos, "UTF-8");
-
} catch (UnsupportedEncodingException e) {
-
e.printStackTrace();
-
}
-
return s;
-
}
测试
-
@Test
-
public void testConvertUTF8ToString() {
-
String str = "E69CA8";
-
String s = EncodeUtil.convertUTF8ToString(str);
-
System.out.print(s); //木
-
}
3. unicode与utf-8之间的转换
3.1 unicode转为utf8
-
//将unicode转换为utf-8
-
@Test
-
public void testUnicodeToUtf8() {
-
String str = "\\u6728";
-
//unicode转换为String String再转换为utf-8
-
String s = EncodeUtil.convertStringToUTF8(EncodeUtil.unicodeToString(str));
-
System.out.println(s);
-
}
3.2 utf8转为unicode
-
//将utf-8转换为unicode
-
@Test
-
public void testUTF8ToUnicode() {
-
String str = "E69CA8";
-
//utf-8先转String String再转unicode
-
String s = EncodeUtil.stringToUnicode(EncodeUtil.convertUTF8ToString(str));
-
System.out.println(s);
-
}
总结来说:
1. java中的一个char是两个字节,以unicode方式存储在内存中。
2. 一个典型的错误是
String s = new String(”木”.getBytes(“utf-8”),”gbk”);
为什么会报错呢?原因是 utf-8编码的字节数组怎能使用gbk来解析呢?一个汉字在utf-8下占用3个字节,而在gbk下占用2个字节,是无法解析的。
3. java中提供了将汉字编码为utf8的方法 UrlEncoder.encode()以及解码的方法UrlDecoder.decode()
参考:
Java unicode中文编码转换和反转
java 汉字与UTF-8十六进制编码 间相互转换方法
java中char与汉字占用字节个数问题
java中unicode utf-8以及汉字之间的转换工具类的更多相关文章
- java中数组、集合、字符串之间的转换,以及用加强for循环遍历
java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...
- java中 列表,集合,数组之间的转换
java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 List和Set都是接口,它们继承Collection(集合),集合里面任何数据 ...
- Json与javaBean之间的转换工具类
/** * Json与javaBean之间的转换工具类 * * {@code 现使用json-lib组件实现 * 需要 * json-lib-2.4-jdk15.jar * ...
- Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】
package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...
- Java Int类型与字符,汉字之间的转换
/** * java 中的流主要是分为字节流和字符流 * 再一个角度分析的话可以分为输入流和输出流 * 输入和输出是一个相对的概念 相对的分别是jvm虚拟机的内存大小 * 从另一个角度讲Java或者用 ...
- Java基础知识强化106:Java中 int 的各进制之间的转换
1.二.八.十.十六进制之间的转换 下面是示例代码,我们直接通过JDK工具库中的方法实现的,如下: public static Integer valueOf(String s, int radix ...
- 怎样在Java中实现基本数据类型与字符之间的转换
摘要:在我们对Java的学习当中数据类型之间的转换,是我们常见的事,我们也都知道基本数据类型之间有自动转换和强制转换,在int . short . long .float .double之间的转 ...
- java中byte,byte[]和int之间的转换
1>byte类型转换为,直接隐式转换,适用于要求保持数值不变,例如要求进行数值计算 如 byte b=0x01; int i=b; 2>另一种是要求保持最低字节中各个位不变,3个高字节全部 ...
- Android单位转换 (px、dp、sp之间的转换工具类)
在Android开发中,涉及到屏幕视频问题的时候,px.dp.sp之间的转换比较重要的一部分,所以杨哥整理了一个工具类给大伙用. package com.zw.express.tool; import ...
随机推荐
- Mahjong tree (hdu 5379 dfs)
Mahjong tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- Library Component Properties的表格如何填写
- [Angular] Setup automated deployment with Angular, Travis and Firebase
Automate all the things!! Automation is crucial for increasing the quality and productivity. In this ...
- Android ServiceManager启动
许久就想写篇关于servicemanager的文章,之前对服务启动顺序诸如zygote,systemserver.等启动顺序理解有点混乱,现做例如以下理解分析: 事实上init进程启动后,Servic ...
- 自定义npm包的创建、发布、更新和撤销
大纲 1.准备2.自定义npm包3.发布自定义npm包4.引用npm包5.更新npm包6.撤销发布的npm包 简书原文 https://www.jianshu.com/p/d737bc5df5b7 1 ...
- CSDN学院 免费技术答疑公开课,本周三场即将开播~~~
为了酬谢广大学员.CSDN学院特推出免费技术答疑公开课,让您开启一段充实的学习之旅~ 本周三场即将开播! ----------------------------------------------- ...
- [WPF自定义控件库]排序、筛选以及高亮
1. 如何让列表的内容更容易查找 假设有这么一个列表(数据源在本地),由于内容太多,要查找到其中某个想要的数据会比较困难.要优化这个列表,无非就是排序.筛选和高亮. 改造过的结果如上. 2. 排序 在 ...
- Nutch+Hadoop集群搭建 分类: H3_NUTCH 2015-01-18 10:55 362人阅读 评论(0) 收藏
转载自:http://www.open-open.com/lib/view/open1328670771405.html 1.Apache Nutch Apache Nutch是一个用于网络搜索 ...
- 【codeforces 742B】Arpa’s obvious problem and Mehrdad’s terrible solution
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 文件流结尾的EOF详解
我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...