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. Nginx分发服务

    nginx配置分发tomcat服务 http://blog.csdn.net/yan_chou/article/details/53265775 http://www.cnblogs.com/deng ...

  2. python3 turtle画正方形、矩形、正方体、五角星、奥运五环

    python3 环境 turtle模块 分别画出 正方形.矩形.正方体.五角星.奥运五环 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:H ...

  3. Kinect开发笔记之三Kinect开发环境配置具体解释

            0.前言:        首先说一下我的开发环境,Visual Studio是2013的,系统是win8的64位版本号,SDK是Kinect for windows SDK 1.8版本 ...

  4. 简介及环境搭建跑通Hello

    简介及环境搭建跑通Hello Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.是为了解决企业应用程序开 ...

  5. async和await在项目中的应用

    Async基础知识: async函数是ES7标准引入的语法,基于Generator函数实现的,也就是说是Generator函数的语法糖.什么是Generator函数?(留个坑) 返回值是Promise ...

  6. PDO中获取结果集

    fetch()方法 fetch()方法用于获取结果集的下一行.语法例如以下: mixed PDOStatement::fetch([int fetch_style][,int cursor_orien ...

  7. 服务器负载均衡lvs(Linux Virtual Server)

    服务器负载均衡lvs(Linux Virtual Server) 一.总结 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 三.Linu ...

  8. php实现调整数组顺序使奇数位于偶数前面

    php实现调整数组顺序使奇数位于偶数前面 一.总结 1.array_push()两个参数,$arr在前 2.array_merge()的返回值是数组   二.php实现调整数组顺序使奇数位于偶数前面 ...

  9. Windows Phone 8.1 后台任务

    Windows Phone 8.1 应用可以添加多个后台任务,以辅助应用完成某些任务. (1)新建前台应用 后台任务是依托于前台应用的,所以必须拥有一个前台应用. 该前台应用的功能很简单,就是读取文件 ...

  10. WP8.1开发:简单的天气预报应用

    今天小梦给大家分享一个简单的天气预报应用源码:调用的是百度API.整个应用都没有什么难点.只是一个简单的网络请求和json数据处理.在WP8.1有小娜的情况下,天气预报应用还有意义吗?我认为还是有点意 ...