1.       汉字字符串与unicode之间的转换

1.1          stringToUnicode


  1. /**
  2. * 获取字符串的unicode编码
  3. * 汉字“木”的Unicode 码点为Ox6728
  4. *
  5. * @param s 木
  6. * @return \ufeff\u6728 \ufeff控制字符 用来表示「字节次序标记(Byte Order Mark)」不占用宽度
  7. * 在java中一个char是采用unicode存储的 占用2个字节 比如 汉字木 就是 Ox6728 4bit+4bit+4bit+4bit=2字节
  8. */
  9. public static String stringToUnicode(String s) {
  10. try {
  11. StringBuffer out = new StringBuffer("");
  12. //直接获取字符串的unicode二进制
  13. byte[] bytes = s.getBytes("unicode");
  14. //然后将其byte转换成对应的16进制表示即可
  15. for (int i = 0; i < bytes.length - 1; i += 2) {
  16. out.append("\\u");
  17. String str = Integer.toHexString(bytes[i + 1] & 0xff);
  18. for (int j = str.length(); j < 2; j++) {
  19. out.append("0");
  20. }
  21. String str1 = Integer.toHexString(bytes[i] & 0xff);
  22. out.append(str1);
  23. out.append(str);
  24. }
  25. return out.toString();
  26. } catch (UnsupportedEncodingException e) {
  27. e.printStackTrace();
  28. return null;
  29. }
  30. }

测试


  1. @Test
  2. public void testGetUnicode() throws Exception {
  3. String str = "木";
  4. String s = EncodeUtil.stringToUnicode(str);
  5. System.out.println(s); //Ox6728
  6. }

1.2          unicodeToString


  1. /**
  2. * Unicode转 汉字字符串
  3. *
  4. * @param str \u6728
  5. * @return '木' 26408
  6. */
  7. public static String unicodeToString(String str) {
  8. Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
  9. Matcher matcher = pattern.matcher(str);
  10. char ch;
  11. while (matcher.find()) {
  12. //group 6728
  13. String group = matcher.group(2);
  14. //ch:'木' 26408
  15. ch = (char) Integer.parseInt(group, 16);
  16. //group1 \u6728
  17. String group1 = matcher.group(1);
  18. str = str.replace(group1, ch + "");
  19. }
  20. return str;
  21. }

测试


  1. @Test
  2. public void testUnicodeToString() throws Exception {
  3. String str = "\\u6728";
  4. String s = EncodeUtil.unicodeToString(str);
  5. System.out.println(s); //木
  6. }

2.       汉字字符串与UTF-8之间的转换

2.1          ConvertStringToUTF8


  1. /**
  2. * 汉字 转换为对应的 UTF-8编码
  3. * @param s 木
  4. * @return E69CA8
  5. */
  6. public static String convertStringToUTF8(String s) {
  7. if (s == null || s.equals("")) {
  8. return null;
  9. }
  10. StringBuffer sb = new StringBuffer();
  11. try {
  12. char c;
  13. for (int i = 0; i < s.length(); i++) {
  14. c = s.charAt(i);
  15. if (c >= 0 && c <= 255) {
  16. sb.append(c);
  17. } else {
  18. byte[] b;
  19. b = Character.toString(c).getBytes("utf-8");
  20. for (int j = 0; j < b.length; j++) {
  21. int k = b[j];
  22. //转换为unsigned integer 无符号integer
  23. /*if (k < 0)
  24. k += 256;*/
  25. k = k < 0? k+256:k;
  26. //返回整数参数的字符串表示形式 作为十六进制(base16)中的无符号整数
  27. //该值以十六进制(base16)转换为ASCII数字的字符串
  28. sb.append(Integer.toHexString(k).toUpperCase());
  29. // url转置形式
  30. // sb.append("%" +Integer.toHexString(k).toUpperCase());
  31. }
  32. }
  33. }
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. return sb.toString();
  38. }

测试


  1. @Test
  2. public void testConvertStringToUTF8() {
  3. String str = "木";
  4. String s = EncodeUtil.convertStringToUTF8(str);
  5. System.out.println(s); //E69CA8
  6. }

2.2          ConvertUTF-8ToString


  1. /**
  2. * UTF-8编码 转换为对应的 汉字
  3. *
  4. * @param s E69CA8
  5. * @return 木
  6. */
  7. public static String convertUTF8ToString(String s) {
  8. if (s == null || s.equals("")) {
  9. return null;
  10. }
  11. try {
  12. s = s.toUpperCase();
  13. int total = s.length() / 2;
  14. //标识字节长度
  15. int pos = 0;
  16. byte[] buffer = new byte[total];
  17. for (int i = 0; i < total; i++) {
  18. int start = i * 2;
  19. //将字符串参数解析为第二个参数指定的基数中的有符号整数。
  20. buffer[i] = (byte) Integer.parseInt(s.substring(start, start + 2), 16);
  21. pos++;
  22. }
  23. //通过使用指定的字符集解码指定的字节子阵列来构造一个新的字符串。
  24. //新字符串的长度是字符集的函数,因此可能不等于子数组的长度。
  25. return new String(buffer, 0, pos, "UTF-8");
  26. } catch (UnsupportedEncodingException e) {
  27. e.printStackTrace();
  28. }
  29. return s;
  30. }

测试


  1. @Test
  2. public void testConvertUTF8ToString() {
  3. String str = "E69CA8";
  4. String s = EncodeUtil.convertUTF8ToString(str);
  5. System.out.print(s); //木
  6. }

3.       unicode与utf-8之间的转换

3.1          unicode转为utf8


  1. //将unicode转换为utf-8
  2. @Test
  3. public void testUnicodeToUtf8() {
  4. String str = "\\u6728";
  5. //unicode转换为String String再转换为utf-8
  6. String s = EncodeUtil.convertStringToUTF8(EncodeUtil.unicodeToString(str));
  7. System.out.println(s);
  8. }

3.2          utf8转为unicode


  1. //将utf-8转换为unicode
  2. @Test
  3. public void testUTF8ToUnicode() {
  4. String str = "E69CA8";
  5. //utf-8先转String String再转unicode
  6. String s = EncodeUtil.stringToUnicode(EncodeUtil.convertUTF8ToString(str));
  7. System.out.println(s);
  8. }

总结来说:

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以及汉字之间的转换工具类的更多相关文章

  1. java中数组、集合、字符串之间的转换,以及用加强for循环遍历

    java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...

  2. java中 列表,集合,数组之间的转换

    java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 List和Set都是接口,它们继承Collection(集合),集合里面任何数据 ...

  3. Json与javaBean之间的转换工具类

    /**  * Json与javaBean之间的转换工具类  *  * {@code 现使用json-lib组件实现  *    需要  *     json-lib-2.4-jdk15.jar  * ...

  4. Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】

    package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...

  5. Java Int类型与字符,汉字之间的转换

    /** * java 中的流主要是分为字节流和字符流 * 再一个角度分析的话可以分为输入流和输出流 * 输入和输出是一个相对的概念 相对的分别是jvm虚拟机的内存大小 * 从另一个角度讲Java或者用 ...

  6. Java基础知识强化106:Java中 int 的各进制之间的转换

    1.二.八.十.十六进制之间的转换  下面是示例代码,我们直接通过JDK工具库中的方法实现的,如下: public static Integer valueOf(String s, int radix ...

  7. 怎样在Java中实现基本数据类型与字符之间的转换

    摘要:在我们对Java的学习当中数据类型之间的转换,是我们常见的事,我们也都知道基本数据类型之间有自动转换和强制转换,在int   . short  . long .float .double之间的转 ...

  8. java中byte,byte[]和int之间的转换

    1>byte类型转换为,直接隐式转换,适用于要求保持数值不变,例如要求进行数值计算 如 byte b=0x01; int i=b; 2>另一种是要求保持最低字节中各个位不变,3个高字节全部 ...

  9. Android单位转换 (px、dp、sp之间的转换工具类)

    在Android开发中,涉及到屏幕视频问题的时候,px.dp.sp之间的转换比较重要的一部分,所以杨哥整理了一个工具类给大伙用. package com.zw.express.tool; import ...

随机推荐

  1. HDU——T 3501 Calculation 2

    http://acm.hdu.edu.cn/showproblem.php?pid=3501 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  2. windows下安装wabt

    windows下安装wabt 安装前准备cmake.mingw环境 安装cmake 安装mingw 步骤 # 1.克隆wabt源码 git clone https://github.com/WebAs ...

  3. 从反编译深入理解JAVA内部类类结构以及finalkeyword

    1.为什么成员内部类能够无条件訪问外部类的成员? 在此之前,我们已经讨论过了成员内部类能够无条件訪问外部类的成员,那详细到底是怎样实现的呢?以下通过反编译字节码文件看看到底.其实,编译器在进行编译的时 ...

  4. html实现返回上一页的几种方法(javaScript:history.go(-1);)

    html实现返回上一页的几种方法(javaScript:history.go(-1);) 一.总结: 1.javaScript:history.go(-1); 二.方法 1.通过超链接返回到上一页 & ...

  5. 11995 - I Can Guess the Data

    大意:猜数据结构是栈.队列或者优先队列,可能为两种以上,也可能都不是. 水题.. STL 记得判断是否为空 #include<iostream> #include<cstdio> ...

  6. autohotkey 自动登录输入用户名密码 getElementsByTagName/getElementsByClassName/getElementById

    针对button未设置id的.可以通过getElementsByTagName获取button的对象数组,再明确其在对象数组中的位置,如第4个button,通过[3]获取.再调用此对象的click() ...

  7. 转 OC温故:类的三大特性(封装,继承,多态)

    原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性 ...

  8. shiro简单配置(转)

    注:这里只介绍spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 Jar包名称 版本 ...

  9. 12、USB设备驱动程序

    linux-3.4.2\driver\hid\usbhid\usbmouse.c 内核只带USB驱动程序 (hub和usb是两个不同的设备,hub在内核上电的过程中在usb_hub_init函数中调用 ...

  10. 【u249】新斯诺克

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 斯诺克又称英式台球,是一种流行的台球运动.在球桌上,台面四角以及两长边中心位置各有一个球洞,使用的球分 ...