标签分类
技术文章
当前位置:主页 > 计算机编程 > java > Java如何实现中文字符串与unicode互转工具类

Java实现中文字符串与unicode互转工具类方法详解

  • 发布时间:
  • 作者:码农之家原创
  • 点击:73

Java如何实现中文字符串与unicode互转工具类

这篇文章主要知识点是关于Jav,中文字符串,unicode,互转工具类,Java如何实现中文字符串与unicode互转工具类,Java 中文字符按Unicode排序的实现方法 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Java编程实战宝典
Java编程实战宝典完整超清版
  • 类型:Java大小:154.4 MB格式:PDF出版:清华大学出版社作者:刘新
立即下载

本文实例为大家分享了Java实现中文字符串与unicode互转的具体代码,供大家参考,具体内容如下

原理利用了java实现js的escape以及unescape函数。

/**
 * 中文字符串和unicode互转工具类 <br>
 * 
 * @author hkb <br>
 */
public class UnicodeConvertUtils {

  /**
   * 实现js的escape函数
   * 
   * @param input
   *      待传入字符串
   * @return
   */
  public static String escape(String input) {
    int len = input.length();
    int i;
    char j;
    StringBuffer result = new StringBuffer();
    result.ensureCapacity(len * 6);
    for (i = 0; i < len; i++) {
      j = input.charAt(i);
      if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j)) {
        result.append(j);
      } else if (j < 256) {
        result.append("%");
        if (j < 16) {
          result.append("0");
        }
        result.append(Integer.toString(j, 16));
      } else {
        result.append("%u");
        result.append(Integer.toString(j, 16));
      }
    }
    return result.toString();

  }

  /**
   * 实现js的unescape函数
   * 
   * @param input
   *      待传入字符串
   * @return
   */
  public static String unescape(String input) {
    int len = input.length();
    StringBuffer result = new StringBuffer();
    result.ensureCapacity(len);
    int lastPos = 0, pos = 0;
    char ch;
    while (lastPos < len) {
      pos = input.indexOf("%", lastPos);
      if (pos == lastPos) {
        if (input.charAt(pos + 1) == 'u') {
          ch = (char) Integer.parseInt(input.substring(pos + 2, pos + 6), 16);
          result.append(ch);
          lastPos = pos + 6;
        } else {
          ch = (char) Integer.parseInt(input.substring(pos + 1, pos + 3), 16);
          result.append(ch);
          lastPos = pos + 3;
        }
      } else {
        if (pos == -1) {
          result.append(input.substring(lastPos));
          lastPos = len;
        } else {
          result.append(input.substring(lastPos, pos));
          lastPos = pos;
        }
      }
    }
    return result.toString();
  }

  /**
   * unicode转中文
   * 
   * @param input
   *      待传入字符串
   * @return
   */
  public static String toGb2312(String input) {
    input = input.trim().replaceAll("(?i)\\\\u", "%u");
    return unescape(input);
  }

  /**
   * 中文字符串转unicode
   * 
   * @param input
   *      待传入字符串
   * @return
   */
  public static String toUnicode(String input) {
    input = input.trim();
    String output = escape(input).toLowerCase().replace("%u", "\\u");
    return output.replaceAll("(?i)%7b", "{").replaceAll("(?i)%7d", "}").replaceAll("(?i)%3a", ":")
        .replaceAll("(?i)%2c", ",").replaceAll("(?i)%27", "'").replaceAll("(?i)%22", "\"")
        .replaceAll("(?i)%5b", "[").replaceAll("(?i)%5d", "]").replaceAll("(?i)%3D", "=")
        .replaceAll("(?i)%20", " ").replaceAll("(?i)%3E", ">").replaceAll("(?i)%3C", "<")
        .replaceAll("(?i)%3F", "?").replaceAll("(?i)%5c", "\\");
  }

  /**
   * 测试
   * 
   * @param args
   */
  public static void main(String[] args) {
    System.out.println(toUnicode("你好"));
    System.out.println(toGb2312("\u4f60\u597d"));
    // 等同于上面
    System.out.println(toGb2312("\\u4f60\\u597d"));
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

Java 中文字符按Unicode排序的实现方法

遇到了一个对包含中文的字符串进行排序的问题。要求按unicode编码对字符串进行排序。

测试字符串数组如下:

    String[] arr = {
        "1-测试",
        "1-编辑",
        "1-营销",
        "1结束",
        "2-测试",
        "1-qt"
    };

按unicode排序的期望结果应该是这样的:

1-编辑, 1-测试, 1-营销, 1-qt, 1结束, 2-测试

先按java.lang.String类提供的默认比较方案进行实现,大致如下:

import java.util.Arrays;
import java.util.Comparator;
public class MyJob {
  public static void main(String[] args) {
    String[] arr = {
        "1-测试",
        "1-编辑",
        "1-营销",
        "1结束",
        "2-测试",
        "1-qt"
    };
    Comparator<String> c = String::compareTo;
    Arrays.sort(arr, c);
    System.out.println(Arrays.toString(arr));
  }
}

结果如下:

[1-qt, 1-测试, 1-编辑, 1-营销, 1结束, 2-测试]

可以看到中文字符不能按照拼音进行排序。这时最直接的思路就是将中文字符转为拼音后再进行排序。但是要注意下,在这里面有个字符串不包含中文字符,这就容易导致顺序混乱。

如下面这几个字符串按拼音进行排序顺序如下:

1-编辑,1-测试,1-qt,1-营销

可以看到字符串“1-qt”的位置出错了。 但是按拼音来说它的位置又是对的。这不能不说是一个让人有些头疼的地方。

不过不用担心,java提供了java.text.Collator类来支持规范化的字符串比较。

使用Collator来改造之前的代码:

import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Locale;
public class MyJob {
  public static void main(String[] args) {
    String[] arr = {
        "1-测试",
        "1-编辑",
        "1-营销",
        "1结束",
        "2-测试",
        "1-qt"
    };
    Comparator<String> c = (o1, o2) -> Collator.getInstance(Locale.CHINESE).compare(o1, o2);
    Arrays.sort(arr, c);
    System.out.println(Arrays.toString(arr));
  }
}

改造后的程序执行排序的结果如下:

[1-qt, 1-编辑, 1-测试, 1结束, 1-营销, 2-测试]

结果看着好像还OK。但是停停、注意下、字符串“1结束”的位置好像比较奇妙,理想情况下它应该在“1-营销”的后面。

这里出问题的原因我没有弄清楚。猜测着应该是java在Chinese语法中将中划线处理为空字符了。不过最根本的问题还是java对Unicode Collation Algorithm(UCA,Unicode整理算法)的支持并不好。

此时可以考虑使用IBM ICU提供的Collator来替换jdk默认的Collator。代码如下:

import com.ibm.icu.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Locale;
public class MyJob {
  public static void main(String[] args) {
    String[] arr = {
        "1-测试",
        "1-编辑",
        "1-营销",
        "1结束",
        "2-测试",
        "1-qt"
    };
    Comparator<String> c = (o1, o2) -> Collator.getInstance(Locale.CHINESE).compare(o1, o2);
    Arrays.sort(arr, c);
    System.out.println(Arrays.toString(arr));
  }
}

相关的依赖为:

   <dependency>
      <groupId>com.ibm.icu</groupId>
      <artifactId>icu4j-localespi</artifactId>
      <version>60.2</version>
    </dependency>

执行结果为:

[1-编辑, 1-测试, 1-营销, 1-qt, 1结束, 2-测试]

可以看到是和预期一致的。

总结

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到等java文章进一步学习,感谢大家的阅读和支持。

上一篇:java对synchronized的优化知识点总结

下一篇:JavaWeb乱码问题的解决方法

展开 +

收起 -

学习笔记
网友NO.713916

Java将字符串写入文本文件代码示例

一、Filewriter与File——-将字符串写入文本文件 public static void main(String[] args) { File f=new File("C:\\world.txt");//新建一个文件对象,如果不存在则创建一个该文件 FileWriter fw; try { fw=new FileWriter(f); String str="hello world"; fw.write(str);//将字符串写入到指定的路径下的文件中 fw.close(); } catch (IOException e) { e.printStackTrace(); } } 二、InputStream与OutputStream 输入与输出串流 public static void main(String args[]){File f= new File("C:\\world.txt") ;InputStream input = null ;// 准备好一个输入的对象try {input = new FileInputStream(f) ;byte b[] = new byte[1024] ;// 所有的内容都读到此数组之中input.read(b) ;// 读取内容 网络编程中 read 方法会阻塞input.close() ;System.out.println("内容为:" + new String(b)) ;} public static void main(String args[]){File f= new File("C:\\world.txt") ;// 声明File对象OutputStream out = null ;// 准备好一个输出的对象out = new FileOutputStream(f) ;// 通过对象多态性,进行实例化String str = "Hello World!!!" ;// 准备一个字符串byte b[] = str.getBytes() ;// 只能输出byte数组,所以将字符串变为byte数组out.write(b) ;// 将内容输出,out.close() ;} 三、ObjectOutputStream与ObjectInputStream ObjectOutputStream将Java对象的基本数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。 将……

网友NO.181518

Java读取String分行字符串的方法

1、场景:String字符串中带有分行,需要提取每一行出来处理。 2、参考代码如下: public static void main(String[] args) throws IOException{ String s="1\r\n2\r\n3\r\n \r\nabd\r\n"; BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(s.getBytes(Charset.forName("utf8"))), Charset.forName("utf8"))); String line; StringBuffer strbuf=new StringBuffer(); while ( (line = br.readLine()) != null ) { if(!line.trim().equals("")){ line="br"+line;//每行可以做加工 strbuf.append(line+"\r\n"); } } System.out.println(strbuf.toString()); } 执行结果: br1br2br3brabd 以上这篇Java读取String分行字符串的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。 ……

网友NO.664642

javascript实现的字符串转换成数组操作示例

本文实例讲述了javascript实现的字符串转换成数组操作。分享给大家供大家参考,具体如下: !DOCTYPE htmlhtml lang="en"head meta charset="UTF-8" titlewww.jb51.net 字符串转换成数组/title script var str="abcdefg" //1、将字符串转成数组形式:split() var arr=str.split("") console.log(arr)//["a", "b", "c", "d", "e", "f", "g"] //2、将数组转成字符串形式:join() var strings=arr.join("")// console.log(strings)//abcdefg //2、将数组元素反转:reverse()函数只能反转数组 var rever=arr.reverse() console.log(rever.join(""))//gfedcba /script/headbody/body/html 运行结果: 感兴趣的朋友可以使用 在线HTML/CSS/JavaScript代码运行工具 :http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。 更多关于JavaScript相关内容还可查看本站专题:《JavaScript数组操作技巧总结》、《JavaScript字符与字符串操作技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》 希望本文所述对大家JavaScript程序设计有所帮助。 ……

网友NO.277593

java实现字符串四则运算公式解析工具类的方法

项目中用到用户定义运算公式进行就算的需求,这样需要进行字符串四则运算解析,下面提供字符串公式四则运算解析与计算工具类,需要的同学可参考。 工具类如下:FormulaCalculator.java: package org.nercita.bcp.record.util; import java.util.ArrayList;import java.util.LinkedList; /** * @author zhangwenchao * @since 2016-08-26 * 公式计算的工具类 */public class FormulaCalculator {private static boolean isRightFormat = true; public static double getResult(String formula){ double returnValue = 0; try{ returnValue = doAnalysis(formula); }catch(NumberFormatException nfe){ System.out.println("公式格式有误,请检查:" + formula); }catch(Exception e){ e.printStackTrace(); } if(!isRightFormat){ System.out.println("公式格式有误,请检查:" + formula); } return returnValue;} private static double doAnalysis(String formula){double returnValue = 0; LinkedListInteger stack = new LinkedListInteger(); int curPos = 0; String beforePart = ""; String afterPart = ""; String calculator = ""; isRightFormat = true; while(isRightFormat(formula.indexOf('(') = 0||formula.indexOf(')') = 0)){curPos = 0; for(char s : formula.toCharArray()){ if(s == '('){ stack.add(curPos); }else if(s == ')'){ if(stack.size() 0){ beforePart = formula.substring(0, stack.getLast()); afterPart = formula.substring(curPos + 1); calculator = formula.substring(stack.getLast() + 1, curPos); formula = beforePart + doCalculation(calculator) + afterP……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明