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 ...
随机推荐
- php-wamp环境搭建
wamp(Windows,Apache,Mysql,PHP) win8.1下搭建apache2.4(64位) php5.6.11(64位) mysql5.6.24(32位) d盘创建文件结构为: ...
- android开发设计辅助工具整理
1.Button设计工具button设计
- ejs模板引擎的使用
引入ejs.min.js 创建模板,以<%=jsCode%>包裹起来其余的html和html结构一样 focusTemplateData是模板使用的数据,使用$.each()方法遍历绑定数 ...
- UVA 488 - Triangle Wave 水~
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 【例题 4-1 UVA - 1339】 Ancient Cipher
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 位置其实都没关系了. 只要每个字母都有对应的字母,它们的数量相同就可以了. 求出每种字母的数量. 排序之后. 肯定是要一一对应的. ...
- swift开发网络篇—NSURLConnection基本使用
iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...
- 2、qq物联环境搭建
1.使用easyopenjtag.openjtag来烧写uboot 2.体验uboot 插讲<网络设置_ping问题解决_远程登录ssh_文件互传ftp> 192.168.1.183 wi ...
- leetcode-combination sum and combination sum II
Combination sum: Given a set of candidate numbers (C) and a target number (T), find all unique combi ...
- [Ionic2] Device Interaction in an Ionic App with Cordova Plugins
In this lesson, we are going to learn how to interact with native components through Cordova plugins ...
- ConcurrentHashMap 内部实现分析
ConcurrentHashMap ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法.Concurrent ...