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 ...
随机推荐
- Android中Application类的详解:
Android中Application类的详解: 我们在平时的开发中,有时候可能会须要一些全局数据.来让应用中的全部Activity和View都能訪问到.大家在遇到这样的情况时,可能首先会想到自定义一 ...
- amazeui学习笔记--css(常用组件3)--按钮组Button-group
amazeui学习笔记--css(常用组件3)--按钮组Button-group 一.总结 1.按钮组用法:把一系列要使用的 .am-btn 按钮放入 .am-btn-group . 2.按钮工具栏: ...
- python3 分解质因数
python3 分解质因数 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan num = int(input(&quo ...
- pragma pack,字节对齐
关于字节对齐 pragma pack 一. 测试代码: // packTest.cpp : Defines the entry point for the console application. / ...
- Android, IOS 史上最强多语言国际化,不仅第一次会尾随系统,并且会保存用户的语言设置
劲爆消息,我提供源代码了.你能够先看完再下载.也能够先下载再看完, android源代码地址: https://github.com/hebiao6446/------Bluetooth-Androi ...
- TCP快速重传与快速恢复原理分析(四种不同的算法)
在TCP/IP中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包.没有FRR,如果数据包丢失了,TCP将会使用定时器来要 ...
- 2、在uboot上实现电源管理
tar xjf u-boot-1.1.6.tar.bz2 cd u-boot-1.1.6 patch -p1 < ../u-boot-1.1.6_jz2440.patch make 100ask ...
- 11、DMA操作说明
先理解cache的作用CPU在访问内存时,首先判断所要访问的内容是否在Cache中,如果在,就称为“命中(hit)”,此时CPU直接从Cache中调用该内容:否则,就 称为“ 不命中”,CPU只好去内 ...
- 【u230】回文词
Time Limit: 1 second Memory Limit: 128 MB [问题描述] CR喜欢研究回文词,有天他发现一篇文章,里面有很多回文数,这使他来了兴趣.他决定找出所有长度在n个字节 ...
- 解决java中ZipFile解压缩时候的中文路径和乱码问题
JAVA中对jar文件或zip文件解压的时候,能够使用JDK内置的API:JarFile和ZipFile,在windows下解压这2种格式文件的时候,常常报下面错误: Exception in thr ...