`

JAVA Unicode 编码和汉字的相互转换

阅读更多

import java.util.regex.Matcher;  
import java.util.regex.Pattern;

/**
 * 时间:2009-8-25
 *
 * 作者:*/


public class T10_BianMa {

    /**
     * java unicode 的相互转换
     */
    public T10_BianMa() {
    }

    public static void main(String[] args){
       
       System.out.println(UnicodeToString("\u901F\u5EA6\u4E2D\u56FD"));
       
       String chinese = "中华人民共和国"; 
       for(int i = 0;i<chinese.length();i++){
           System.out.print("\\u " + Integer.toHexString(chinese.charAt(i)));
           //System.out.print(chinese.getBytes("Unicode")[i]);
          
       }
       System.out.println();
      
           
       String str = "\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd";    
         
       for(int j = 0;j<str.length();j++) {
           System.out.println(str.charAt(j));
       }
    }

    public static String UnicodeToString(String str) {
        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4 }))");   
        Matcher matcher = pattern.matcher(str);
        char ch;
        while (matcher.find()) {
            ch = (char) Integer.parseInt(matcher.group(2), 16);
            str = str.replace(matcher.group(1), ch + "");   
        }
        return str;
    }


/**

将JDK的bin目录加入系统变量path。在盘下建立一个test目录,在test目录里建立一个zh.txt文件,
文件内容为:“熔岩”,打开“命令行提示符”,并进入C:\test目录下。下面就可以按照说明一步一步来操作,注意观察其中编码的变化。

A:将zh.txt转换为Unicode编码,输出文件到u.txt
native2ascii zh.txt u.txt
打开u.txt,内容为“\u7194\u5ca9”。
B:将zh.txt转换为Unicode编码,输出到控制台 --Unicode输出文件
C:\test>native2ascii zh.txt       
\u7194\u5ca9
可以看到,控制台输出了“\u7194\u5ca9”。
C:将zh.txt转换为ISO8859-1编码,输出文件到i.txt
native2ascii -encoding ISO8859-1 zh.txt i.txt
打开i.txt文件,内容为“\u00c8\u00db\u00d1\u00d2”。
D:将u.txt转换为本地编码,输出到文件u_nv.txt  --输出文件
native2ascii -reverse u.txt u_nv.txt
打开u_nv.txt文件,内容为“熔岩”。
E:将u.txt转换为本地编码,输出到控制台
C:\test>native2ascii -reverse u.txt
熔岩
可以看到,控制台输出了“熔岩”。
F:将i.txt转换为本地编码,输出到i_nv.txt  
native2ascii -reverse i.txt i_nv.txt
打开i_nv.txt文件,内容为“\u00c8\u00db\u00d1\u00d2”。发现转码前后完全一样的。也就是说,等于没有转,或者说思想糊涂,对命名没有理解。。

G:将i.txt转换为GBK编码,输出到i_gbk.txt
native2ascii -reverse -encoding GBK i.txt i_gbk.txt
打开i_gbk.txt文件,内容为“\u00c8\u00db\u00d1\u00d2”。发现转码前后完全一样的。也就是说,等于没有转,或者说思想糊涂,对命名没有理解。

H:将u_nv.txt转码到本地编码GBK,输出到控制台
C:\test>native2ascii -reverse -encoding ISO8859-1 i.txt         
熔岩
从这个结果看,目标达到到了,编码i.txt为ISO8859-1,转为本地编码后内容为“熔岩”。
从这里应该意识到,native2ascii -reverse命令中-encoding指定的编码为源文件的编码格式。
而在native2ascii 命令中-encoding指定的编码为(生成的)目标文件的编码格式。这一点非常的重要!切记!!

继续探索,新建文件12a.txt,内容“12axyz”。看看纯字母数字的编码又如何。

I:将纯字母数字的文本文件12a.txt转换为Unicode编码
native2ascii 12a.txt 12a_nv.txt
打开12a_nv.txt文件,内容为“12axyz”。
继续测试,转为ISO8859-1编码看看
C:\test>native2ascii -encoding ISO8859-1 12a.txt
12axyz
结果还是没有转码。

*/
   
}

 //========================================================================

/**
     * 将字符串编码成 Unicode 。
     * @param theString 待转换成Unicode编码的字符串。
     * @param escapeSpace 是否忽略空格。
     * @return 返回转换后Unicode编码的字符串。
     */
    public static String toUnicode(String theString, boolean escapeSpace) {
        int len = theString.length();
        int bufLen = len * 2;
        if (bufLen < 0) {
            bufLen = Integer.MAX_VALUE;
        }
        StringBuffer outBuffer = new StringBuffer(bufLen);

        for(int x=0; x<len; x++) {
            char aChar = theString.charAt(x);
            // Handle common case first, selecting largest block that
            // avoids the specials below
            if ((aChar > 61) && (aChar < 127)) {
                if (aChar == '\\') {
                    outBuffer.append('\\'); outBuffer.append('\\');
                    continue;
                }
                outBuffer.append(aChar);
                continue;
            }
            switch(aChar) {
                case ' ':
                    if (x == 0 || escapeSpace)
                        outBuffer.append('\\');
                    outBuffer.append(' ');
                    break;
                case '\t':outBuffer.append('\\'); outBuffer.append('t');
                          break;
                case '\n':outBuffer.append('\\'); outBuffer.append('n');
                          break;
                case '\r':outBuffer.append('\\'); outBuffer.append('r');
                          break;
                case '\f':outBuffer.append('\\'); outBuffer.append('f');
                          break;
                case '=': // Fall through
                case ':': // Fall through
                case '#': // Fall through
                case '!':
                    outBuffer.append('\\'); outBuffer.append(aChar);
                    break;
                default:
                    if ((aChar < 0x0020) || (aChar > 0x007e)) {
                        outBuffer.append('\\');
                        outBuffer.append('u');
                        outBuffer.append(toHex((aChar >> 12) & 0xF));
                        outBuffer.append(toHex((aChar >>  8) & 0xF));
                        outBuffer.append(toHex((aChar >>  4) & 0xF));
                        outBuffer.append(toHex( aChar        & 0xF));
                    } else {
                        outBuffer.append(aChar);
                    }
            }
        }
        return outBuffer.toString();
    }
   
    /**
     * 从 Unicode 码转换成编码前的特殊字符串。
     * @param in Unicode编码的字符数组。
     * @param off 转换的起始偏移量。
     * @param len 转换的字符长度。
     * @param convtBuf 转换的缓存字符数组。
     * @return 完成转换,返回编码前的特殊字符串。
     */
    public String fromUnicode(char[] in, int off, int len, char[] convtBuf) {
        if (convtBuf.length < len) {
            int newLen = len * 2;
            if (newLen < 0) {
                newLen = Integer.MAX_VALUE;
            }
            convtBuf = new char[newLen];
        }
        char aChar;
        char[] out = convtBuf;
        int outLen = 0;
        int end = off + len;

        while (off < end) {
            aChar = in[off++];
            if (aChar == '\\') {
                aChar = in[off++];
                if (aChar == 'u') {
                    // Read the xxxx
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        aChar = in[off++];
                        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.");
                        }
                    }
                    out[outLen++] = (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';
                    }
                    out[outLen++] = aChar;
                }
            } else {
                out[outLen++] = (char) aChar;
            }
        }
        return new String(out, 0, outLen);
    }
}
 private static final char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; 
    
    private static char toHex(int nibble) { return hexDigit[(nibble & 0xF)]; } 

 

 

 

分享到:
评论
2 楼 在世界的中心呼喚愛 2013-10-30  
outBuffer.append(toHex((aChar >> 12) & 0xF)); 

                        outBuffer.append(toHex((aChar >>  & 0xF)); 
                        outBuffer.append(toHex((aChar >>  4) & 0xF)); 
                        outBuffer.append(toHex( aChar        & 0xF));


这句什么意思呢?
1 楼 在世界的中心呼喚愛 2012-11-30  
不错,大小写有转换

相关推荐

    java 中文Unicode转换

    本文将深入探讨如何在Java中进行中文字符到Unicode编码的转换,以及如何从Unicode编码还原为中文字符。 首先,我们来了解Unicode的基本概念。Unicode是一个国际标准,它为每个字符分配了一个唯一的数字,这个数字被...

    Unicode中文编码对照表

    标签“源码”暗示了这个话题可能涉及到编程和代码实现,可能讲解了如何在编程语言中使用Unicode编码来处理中文字符,例如Java、Python或C++。而“工具”标签则可能意味着存在某种工具或库,可以帮助开发者进行...

    Unicode编码所有汉字

    总结一下,本压缩包可能包含的是一个用于演示如何在CMD中使用Java处理Unicode编码汉字的示例项目。通过学习和理解Unicode编码及其在Java中的应用,你可以更深入地了解字符编码体系,并提升你的跨语言编程能力。

    Java做的Unicode编码转换器

    Java编写的Unicode编码转换器是一种实用工具,它能够帮助用户将各种国家和地区的文字转换成Unicode编码,同时也能实现从Unicode编码回转到原始字符。Unicode是一种国际标准,旨在为全球所有的字符提供一个统一的编码...

    unicode编码与汉字的对应关系

    在实际应用中,Unicode编码的汉字需要与各种不同的编码格式进行转换,以适应不同的系统环境和需求。例如,UTF-8编码是一种可变长度的Unicode编码方式,广泛应用于Web页面和文件传输中,因为它能高效地表示包括汉字...

    Unicode编码转换源码

    总之,Unicode编码转换源码是关于在不同编码体系之间进行转换的程序,涉及Unicode码点和各种编码格式如UTF-8的交互。掌握这一技术有助于实现跨平台、跨语言的信息交换,对于构建全球化软件至关重要。通过深入理解...

    Java中编码方式和Unicode知识总结

    - UTF-8是最常用的Unicode编码形式之一,它是变长编码,可与ASCII兼容。 在Java中,通常使用String类的构造函数或者字符串的字面量来表示字符串数据。对于中文字符,建议使用UTF-16编码,因为Java内部使用UTF-16...

    中文unicode编码表.rar

    在编程语言中,如Python、Java等,都有内置对Unicode的支持,可以直接处理和操作Unicode编码的字符串。 了解并掌握中文Unicode编码表,对于从事IT行业的人员来说,无论是进行网页开发、数据处理还是软件设计,都是...

    JAVA反编译和unicode转字符.rar

    描述中的“反编译后的汉字unicode显示格式转换为字符格式的代码”意味着在反编译过程中,可能会遇到汉字以Unicode编码形式出现,这通常是由于Java字节码中存储字符串的方式决定的。Unicode编码虽然通用,但在直接...

    Unicode和汉字互相转换工具

    Unicode和汉字转换是计算机处理中文字符时经常遇到的问题。Unicode是一种国际编码标准,它为世界上几乎所有的文字系统提供了一个统一的编码方式,包括汉字。汉字转换则是将汉字在不同的编码格式间进行转换,如从...

    Java字符串取GBKUNICODE编码和相互转换.doc

    ### Java字符串取GBK与UNICODE编码及相互转换详解 #### 一、引言 在处理中文等非ASCII字符时,经常需要对字符串进行编码转换,尤其是GBK和Unicode之间的转换。本文将详细介绍如何在Java中实现字符串从GBK到Unicode...

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

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

    java实现十六进制字符unicode与中英文转换示例

    在Java编程语言中,处理Unicode编码和十六进制字符转换是一项常见的任务,特别是在处理文本数据时。本示例探讨了如何使用Java实现从Unicode十六进制字符串到中英文字符的转换,以及反过来的过程。理解Unicode和UTF...

    gb18030的汉字编码,Unicode汉字编码表

    Unicode编码的常见形式有UTF-8、UTF-16和UTF-32。 在编程中,字符集问题通常涉及到编码的转换、读写文件、网络数据传输等方面。例如,当你从GBK编码的文本文件读取数据并试图在UTF-8编码的程序中处理时,必须进行...

    Unicode编码转GBK编码(汉字转GBK)

    在网上找资料很少有汉字直接转GBK编码格式,一般都是汉字转Unicode编码,这套是将汉字先转换成Unicode编码,在通过参照表得出汉字的GBK编码数据。虽然是一个js文件,但是加以修改可以用于很多平台上如:小程序,...

    Unicode—汉字互相转换工具

    这个“Unicode—汉字互相转换工具”正是基于这一标准,为用户提供了一个便捷的平台来查询汉字与Unicode编码之间的相互转换。 在信息技术领域,Unicode的重要性不言而喻。它解决了早期计算机系统中各种不同的字符...

    最全的常用汉字Unicode码表

    3. **文本编辑器插件**:部分高级文本编辑器提供了专门用于查看和转换Unicode编码的插件或扩展功能。 #### Unicode与汉字的发展趋势 随着技术的进步和社会需求的变化,Unicode也在不断地更新和完善中。未来,我们...

    Java Unicode 和字符集

    本文将详细介绍Java中Unicode和字符集的基础知识。 #### 二、ASCII编码 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种基于拉丁字母的一套电脑编码系统,被国际标准化...

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

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

Global site tag (gtag.js) - Google Analytics