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:parentActivityName后,点击子Activity返回键,父Activity总会调用OnDestroy()的解决方式
近期查了非常久这个事情.分享给大家, 原理非常easy,一个Activity在manifet里声明了android:parentActivityName:这时候通过Activity左上角的返回butt ...
- cdn缓存
1:缓存是什么? 首先.看看没有站点没有接入CDN时.用户浏览器与server是怎样交互的: 假设中间加上一层CDN,那么用户浏览器与server的交互例如以下: client浏览器先检查是否有本地缓 ...
- Redo 非current损坏
Redo log 文件损坏或丢失,在启动数据库时在alert日志中会有如下错误: ORA-00313: open failed for members of log group 1 of thread ...
- 芯片TPS70925
TPS70925电源芯片 从上图中可以看出EN脚是使能脚,并且是高使能,低失能. tps70925的典型用法: 这个芯片有很多封装,我们用的是第一个:
- 【CS Round #48 (Div. 2 only)】8 Divisible
[链接]h在这里写链接 [题意] 给你一个长度为n的数字(n<=1000) 然后让你任意组合这个数字. 使得这个数字能被8整除. (不能出现前导0) [题解] 只要后三位能被8整除就可以了. 则 ...
- vim 保存文件的回车换行模式
设置模式:unix,dos :set fileformat=unix fileforman可以直接缩写为ff
- android 蓝牙各种UUID
ServiceDiscoveryServerServiceClassID_UUID = '{00001000-0000-1000-8000-00805F9B34FB}' BrowseGroupDesc ...
- [arm]虚拟机,2440开发板,主机三者互通
想实现3着互通先必须保证三者的网段是相同的: 首先查看电脑主机的IP: 然后再看看虚拟机的IP: 惊喜的发现,他们在一个网段上---那就不用改了-- 再去看看开发板上的IP: 这里注意,输入命令时,是 ...
- SpringBoot application.yml logback.xml,多环境配置,支持 java -jar --spring.profiles.active(转)
趁今天有时间整理了一下 启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 jav ...
- [RxJS] Multicasting shortcuts: publish() and variants
Because using multicast with a new Subject is such a common pattern, there is a shortcut in RxJS for ...