`
香煎马鲛鱼
  • 浏览: 107161 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Java的Unicode编码转化(多种情况处理方法)

    博客分类:
  • java
阅读更多

JavaUnicode编码转化(多种情况处理方法)

Javaunicode转中文的情况使用的场景很多,是一个很常见的需求,按理来说,这样的功能应该被java集成起来,不过很遗憾,java提供的方法很烂,很多时候我们需要自己去写。

好在这个需求的源代码网上很多,在查资料的过程中,我找到啦好几种,下面我将我找到的资料分享和我自己实现的方法提供给大家;希望大家能有个参考;

1、java中使用的是unicode编码,所以如果我们得到的本身就是一个unicode编码,那么我们可以直接print出来的就是中文:

    public static void main(String[] args){

        String string= "\u9999\u714e\u9a6c\u9c9b\u9c7c\u7684\u535a\u5ba2";

        System.out.println(string);

    }

 

输出:

 



 可是像上面那种情况在实际问题里是很少见的,在1例子中,
\是转义字符,实际我们得到的unicode编码是这样的:

    public static void main(String[] args){

        String string= "\\u9999\\u714e\\u9a6c\\u9c9b\\u9c7c\\u7684\\u535a\\u5ba2";

        System.out.println(string);

    }

而这样得到的输出结果就变成了这样:

 



 

这样的结果肯定是我们不想要的,那么解决方法是什么呢:

方法一:这是在网上最常见的一种方法,直接将方法decodeUnicode放在类中就可以,方便,不过缺点就是代码量比较大,下面我们测试一下它的转义能力

测试项

例子

输出

正确结果

总结

基本能力

\u9999\u714e\u9c7c

香煎鱼

香煎鱼

正确

中英文数字混合

1\u9999123\u714ehi\u9c7ca

1123hia

1123hia

正确

中英文,特殊字符混合

\u9999\u\u714e\u9c7c

(错误)

\u煎鱼

无法正常运行

\u9999\\u714e\u9c7c

\u714e

\煎鱼

转义有误

可见,方法一虽然能对中英混合进行识别,但对\\u的识别仍然存在问题,我们可以给他打70分;

    public static String decodeUnicode(String theString) {

        char aChar;

        int len = theString.length();

        StringBuffer outBuffer = new StringBuffer(len);

        for (int x = 0; x < len;) {

            aChar = theString.charAt(x++);

            if (aChar == '\\') {

                aChar = theString.charAt(x++);

                if (aChar == 'u') {

                    // Read the xxxx

                    int value = 0;

                    for (int i = 0; i < 4; i++) {

                        aChar = theString.charAt(x++);

                        switch (aChar) {

                            case '0':

                            case '1':

                            case '2':

                            case '3':

                            case '4':

                            case '5':

                            case '6':

                            case '7':

                            case '8':

                            case '9':

                                value = (value << 4) + aChar - '0';

                                break;

                            case 'a':

                            case 'b':

                            case 'c':

                            case 'd':

                            case 'e':

                            case 'f':

                                value = (value << 4) + 10 + aChar - 'a';

                                break;

                            case 'A':

                            case 'B':

                            case 'C':

                            case 'D':

                            case 'E':

                            case 'F':

                                value = (value << 4) + 10 + aChar - 'A';

                                break;

                            default:

                                throw new IllegalArgumentException(

                                        "Malformed   \\uxxxx   encoding.");

                        }

                    }

                    outBuffer.append((char) value);

                } else {

                    if (aChar == 't')

                        aChar = '\t';

                    else if (aChar == 'r')

                        aChar = '\r';

                    else if (aChar == 'n')

                        aChar = '\n';

                    else if (aChar == 'f')

                        aChar = '\f';

                    outBuffer.append(aChar);

                }

            } else

                outBuffer.append(aChar);

        }

        return outBuffer.toString();

    }

}

 

方法二:此种方法在网上也比较常见,代码量少,可读性强是它最大的优点,但是,它的转义能力……大家自己体会一下吧;

测试项

例子

输出

正确结果

总结

基本能力

\u9999\u714e\u9c7c

香煎鱼

香煎鱼

正确

中英文数字混合

1\u9999123\u714ehi\u9c7ca

(错误)

1123hia

无法正常运行

中英文,特殊字符混合

\u9999\u\u714e\u9c7c

(错误)

\u煎鱼

无法正常运行

\u9999\\u714e\u9c7c

(错误)

\煎鱼

无法正常运行

它的转义能力决定它的实用性不强,但是鉴于它比较简单,所以还是有一定市场的,不过也请大家谨慎使用,根据我的测试,这种转码方式只对全中文有效

    public static String ascii2native_orl(String ascii) {

        int n = ascii.length() / 6;

        StringBuilder sb = new StringBuilder(n);

        for (int i = 0, j = 2; i < n; i++, j += 6) {

            String code = ascii.substring(j, j + 4);

            char ch = (char) Integer.parseInt(code, 16);

            sb.append(ch);

        }

        return sb.toString();

}

 

方法三:既然方法二有问题,那么我们能不能对他进行一些改进,让它适应性更强呢,当然,如果方法二加上正则表达式,就有更强的功能了

测试项

例子

输出

正确结果

总结

基本能力

\u9999\u714e\u9c7c

香煎鱼

香煎鱼

正确

中英文数字混合

1\u9999123\u714ehi\u9c7ca

1123hia

1123hia

正确

中英文,特殊字符混合

\u9999\u\u714e\u9c7c

\u煎鱼

\u煎鱼

正确

\u9999\\u714e\u9c7c

\煎鱼

\煎鱼

正确

   这种方法很好利用了正则表达式,代码可读性强,转义能力也很不错,强烈推荐

 public static String ascii2native(String ascii) {

 

        List<String> ascii_s = new ArrayList<String>();

        String zhengz= "\\\\u[0-9,a-f,A-F]{4}";

        Pattern p = Pattern.compile(zhengz);

        Matcher m=p.matcher(ascii);

        while (m.find()){

            ascii_s.add(m.group());

        }

        for (int i = 0, j = 2; i < ascii_s.size(); i++) {

            String code = ascii_s.get(i).substring(j, j + 4);

            char ch = (char) Integer.parseInt(code, 16);

            ascii = ascii.replace(ascii_s.get(i),String.valueOf(ch));

        }

        return ascii;

}

 

总结:其实,三种方法的基本思想都是一样的,但是最大的区别就是在怎么短句,短句的方法不同,解析能力也不同。

<!--EndFragment-->
  • 大小: 2.4 KB
  • 大小: 4.1 KB
2
0
分享到:
评论
2 楼 香煎马鲛鱼 2014-11-24  
ahack 写道
多谢楼主分享,decodeUnicode的代码的确有问题。

谢谢哈
1 楼 ahack 2014-11-23  
多谢楼主分享,decodeUnicode的代码的确有问题。

相关推荐

    Notepad++(UNICODE)简体中文

    Notepad++(UNICODE)简体中文

    UnicodeUtil.java

    java中unicode编码工具类,可直接使用,内含将字符串转化为unicode编码,unicode码转化成字符串,将中文转化成unicode,将每个\前面加上%进行模糊查询方法

    各种字符集编码表,包括iso-8859-1,gbk,gb18030, unicode

    各种字符集编码表,包括iso-8859-1,gbk,gb18030, unicode,以及字符集的转换说明(主要是Java国际化的一些字符集转化说明)

    scala-unicode:用于为 Scala 生成 unicode 表的 Scala 代码

    JDK11 是 Java 的下一个生产版本,跟踪 Unicode 10.0.0。 较新标准的缺点是它们包含更多的代码点,这会转化为更多的数据和更大的二进制大小。 这对下面的目标#4不利,但添加了字体和表情符号。 本项目的总体目标...

    Java 中文乱码的处理

    随着计算机的发展,为了适应世界其它民族的语言(当然包括我们的汉字),人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大多数国际性的软件内部均采用UNICODE编码...

    javascript unicode与GBK2312(中文)编码转换方法

    代码如下:var GB2312UnicodeConverter = { ToUnicode: function (str) { return escape(str).toLocaleLowerCase().replace(/%u/gi, ‘\\u’); } , ToGB2312: function (str) { return unescape(str.replace(/\\...

    JAVA面试题最全集

    51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52.一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历...

    java发送短信之AT指令

    public String sendAT(String atcommand) throws java.rmi.RemoteException { String s = ""; try { Thread.sleep(100); writeln(atcommand); Thread.sleep(80); s = read(); Thread.sleep(100); } catch ...

    字符串格式化工具JSON、XML、HTML,常用字符串格式转换工具与加密方式查看, Unix时间戳工具

    Java Swing GUI桌面应用工具,集成常用的开发调试工具。 如: ...2、Unix时间戳,获取最新时间,Unix时间戳转化为通用时间字符串格式 3、字符串长度计算 4、Url编码 解码 5、Base64 加密 解密 6、Unicode 编码 解码

    notepad2 中文版

    Notepad2是一个外观类似系统记事本的...2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标

    新版Android开发教程.rar

    � Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的有限子集,尚不承诺遵守 Java 任何 Java 规范 , 可能会造 成J ava 阵营的进一步分裂。 � 现有应用完善度不太够,需要的开发工作量较大。--------------------...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    面向对象的思想方法已经非常流行了,在编程语言(例如java,js)中,都运用面向对象的编程思想。在XML中,就是要将网页也作为一个对象来操作和控制,我们可以建立自己的对象和模板。与对象进行交流,如何命令对象,...

    正则表达式30分钟入门教程

    对中文/汉字的特殊处理是由.Net提供的正则表达式引擎支持的,其它环境下的具体情况请查看相关文档。 下面来看看更多的例子: \ba\w*\b匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量...

    freemarker总结

    JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: &lt;#if condition&gt;... &lt;#elseif condition&gt;... &lt;#elseif condition&gt;......

Global site tag (gtag.js) - Google Analytics