`
香煎马鲛鱼
  • 浏览: 109787 次
  • 性别: 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的代码的确有问题。

相关推荐

    JAVA反编译和unicode转字符.rar

    Unicode编码虽然通用,但在直接查看时并不直观,需要进行解码才能转化为可读的字符。这部分代码可能是一个解码函数或者脚本,其目的是将这些Unicode编码转换为对应的汉字,使得开发者能更方便地阅读和理解反编译结果...

    java中字符串转unicode

    这里提供一个能转换十进制和十六进制unicode的java的util类,我们经常会遇到乱码问题,比如在后端与前端交互的时候,由于框架的种种原因,导致乱码,这时候就用到了unicode(万能码),在乱码前转为unicode,就可以...

    中文转化unicoder码的方法

    - 数据库存储:Unicode编码有利于存储多种语言的数据,尤其是对于需要跨国或跨语言交互的数据库系统。 5. 示例文件分析: - "www.pudn.com.txt"可能是一个包含中文字符的文本文件,我们可以用编程语言读取并处理...

    中文转化为unicode格式的方法类

    总结来说,将中文转化为 Unicode 格式是通过理解 Unicode 编码原理,利用 Java 提供的相关 API 完成的。`unicodeConvert.java` 类是实现这一功能的代码载体,它可以方便地在各种场景下进行中文字符与 Unicode 之间的...

    Unicode编码转换小工具

    这个“Unicode编码转换小工具”是由Java开发的,可以帮助用户将字符串转化为Unicode编码形式,这对于处理多语言文本或者进行数据传输时避免字符乱码问题非常有用。 在编程领域,尤其是涉及到字符串处理时,了解...

    Unicode码转中文和中文转Unicode码的最简便的方法

    通过这种方式,你可以方便地在Unicode码和中文字符之间进行转换,这对于处理多语言文本或跨平台的字符编码问题非常有帮助。在处理涉及不同编码格式的文件时,了解如何使用`native2ascii`工具是非常重要的,它能帮助...

    Notepad++(UNICODE)简体中文

    这款软件是用C++编写的,并且实现了UNICODE编码,确保了对不同字符集的支持,包括简体中文。 在Notepad++中,"UNICODE"指的是UTF-16编码,这是一种广泛使用的Unicode实现方式,能够处理世界上几乎所有的文字系统。...

    Java的编码机制,处理中文乱码必读材料

    在Java中,JVM的核心字符集是基于Unicode的,这意味着Java中的`char`类型变量存储的是Unicode编码的双字节字符。Java源代码可以使用任意字符编码,但在编译成Class字节码时,源代码会转化为UTF-8编码。Java Web应用...

    java中文繁体转中文简体

    在计算机中,中文字符的表示通常使用Unicode编码,它包含了繁体字和简体字。Unicode是国际标准,可以表示世界上大部分文字系统,包括GBK、Big5(常用于繁体中文)和UTF-8等编码方式。 Java中的`java.text`包提供了...

    Java Emoji Converter表情转换工具

    在Java编程语言中,处理Emoji可能会涉及到Unicode编码、字体映射以及平台特定的实现。Java Emoji Converter提供了一个统一的接口,允许开发者将一个格式的Emoji字符串转化为另一种格式,确保在各种环境中都能正确...

    java字符之间的转化

    在Java编程语言中,字符之间的转化是常见的操作,特别是在处理字符串、字符数组或者与外部数据交互时。Java提供了丰富的API和内置类型来支持这些转化。本文将深入探讨Java中字符间转换的关键知识点。 首先,Java中...

    java properties文件中文转化

    这篇名为“Java Properties文件中文转化”的博文主要探讨了如何解决Java Properties文件在处理中文字符时的编码问题。博主分享了一个实用的方法,即通过Unicode转换工具来处理含有中文字符的properties文件,以确保...

    JAVA中汉字字符转化为英文字符

    - **UTF-8**: 一种常用的Unicode编码方式,可变长度,兼容ASCII,并且能表示Unicode中的所有字符。 ##### 2. 方法 `toTureAsciiStr` 该方法的目标是将汉字转化为对应的英文字符。其工作原理如下: - **参数**: - ...

    unicode转码工具

    例如,当一个网页或者软件需要显示多种语言的文本时,就需要用到Unicode编码。 “文本与unicode码转换小工具V1.02.02”很可能是一个小巧的桌面应用程序,具备以下功能: 1. 输入汉字:用户可以直接输入汉字,工具会...

    Unicode工具

    一旦安装完成,用户可以通过输入中文、日文等文本,查看其对应的Unicode码点,也可以将Unicode编码转化为可读的字符。这对于开发者来说,是一个非常实用且高效的辅助工具,特别是在处理非英文字符集时。

    java 处理中文问题代码

    然而,网络传输和文件系统往往采用不同的编码格式,如GB2312、GBK、UTF-8等,这些编码方式与Java内部的Unicode编码并不总是兼容。因此,在读取或写入中文字符时,必须正确地进行编码转换,避免出现乱码现象。 ### ...

    中文转换成NCR编码

    例如,"利用"的Unicode编码是U+52294,"有效"的Unicode编码是U+75283,"的"的Unicode编码是U+96401。在HTML中,我们可以通过写成`&#x5229;`、`&#x7528;`和`&#x9640;`这样的形式来表示这三个字符,这样无论浏览器支持...

    java字符集编码乱码详解

    这意味着 Java 源文件会被编译器按照系统默认编码读取,然后转换为 Unicode 编码保存。例如,使用 javac 命令编译时,会将所有的字符转化为 Unicode 格式存储。 在运行时,JVM 使用 Unicode 进行字符编码。这意味着...

    java编译 编码

    保存文件时同样涉及到编码转换:从键盘输入缓冲区的GBK编码转换为内存处理区的Unicode编码,再进一步转换为文件保存缓冲区的特定编码(如GBK、UTF-8或Unicode)。 #### 二、Java源文件的编译过程 在编译Java源文件...

Global site tag (gtag.js) - Google Analytics