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 ...
随机推荐
- ArcGIS教程:地理处理服务演示样例(河流网络)(三)
设置输出符号系统 步骤: 展开 StoweStreamNet.tbx 并双击创建河流网络模型. 接受默认的 45 公顷并单击确定以运行模型. StreamNet 图层将加入至 ArcMap. 右键单击 ...
- (转)c运行库、c标准库、windows API的区别和联系
C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的. API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...
- 从Unreal Engine 3到Unreal Engine 4
Unreal Engine 4公布好长好长时间了.直到近期才有时间细致去看一下. TimSweeney老大一句话"IF YOU LOVE SOMETHING, SET IT FREE&quo ...
- 首次使用vim
不管是linux还是cygwin,刚安装完系统之后使用vim时都需要对vim进行配置.未配置的情况下,象方向键.回车键.退格键都不会是正常的反应.因为vim默认使用了vi的操作模式. 不多说,上代码. ...
- Linux下的lds链接脚本简介(三)
八. 内存区域命令 在默认情形下,连接器可以为section在程序地址空间内分配任意位置的存储区域.并通过输出section描述的> REGION属性显示地将该输出section限定于在程序地址 ...
- [RxJS] BehaviorSubject: representing a value over time
When an Observer subscribe to a BehaviorSubject. It receivces the last emitted value and then all th ...
- windows关闭进程 批处理端口占用
cmd 关闭进程java taskkill /F /IM java.exe taskkill /f /im java.exe 如何用dat批处理文件关闭某端口对应程序-Windows自动化命令 如何用 ...
- hprof教程 分类: B1_JAVA 2015-03-02 12:18 444人阅读 评论(0) 收藏
大部分内容参考http://www.linuxidc.com/Linux/2012-04/58178.htm J2SE中提供了一个简单的命令行工具来对java程序的cpu和heap进行 profili ...
- 如何用Swift创建一个复杂的加载动画
现在在苹果应用商店上有超过140万的App,想让你的app事件非常具有挑战的事情.你有这样一个机会,在你的应用的数据完全加载出来之前,你可以通过一个很小的窗口来捕获用户的关注. 没有比这个更好的地方让 ...
- image-base64互转
package base64StringToImage; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStrea ...