`
312350968
  • 浏览: 212569 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java:转换汉字为unicode形式的字符串和转换unicode形式字符串转换成汉字

阅读更多

/* 输出
Original:       黄   彪彪
to unicode:     \u9EC4\ \t\u5F6A\u5F6A
from unicode:   黄   彪彪
使用命令转换: native2ascii -encoding utf-8 a.txt a.txt
Java的properties属性文件会把字符先转换成unicode的形式存储.
*/

import java.io.UnsupportedEncodingException;

public class UnicodeConverter {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "黄 \t彪\u5F6A";
        System.out.println("Original:\t\t" + s);

        s = toEncodedUnicode(s, true);
        System.out.println("to unicode:\t\t" + s);

        s = fromEncodedUnicode(s.toCharArray(), 0, s.length());
        System.out.println("from unicode:\t" + s);
    }

    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)];
    }

    /**
     * 将字符串编码成 Unicode 形式的字符串. 如 "黄" to "\u9EC4"
     * Converts unicodes to encoded \\uxxxx and escapes
     * special characters with a preceding slash
     * 
     * @param theString
     *        待转换成Unicode编码的字符串。
     * @param escapeSpace
     *        是否忽略空格,为true时在空格后面是否加个反斜杠。
     * @return 返回转换后Unicode编码的字符串。
     */
    public static String toEncodedUnicode(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)) {
                    // 每个unicode有16位,每四位对应的16进制从高位保存到低位
                    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 形式的字符串转换成对应的编码的特殊字符串。 如 "\u9EC4" to "黄".
     * Converts encoded \\uxxxx to unicode chars
     * and changes special saved chars to their original forms
     * 
     * @param in
     *        Unicode编码的字符数组。
     * @param off
     *        转换的起始偏移量。
     * @param len
     *        转换的字符长度。
     * @param convtBuf
     *        转换的缓存字符数组。
     * @return 完成转换,返回编码前的特殊字符串。
     */
    public static String fromEncodedUnicode(char[] in, int off, int len) {
        char aChar;
        char[] out = new char[len]; // 只短不长
        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);
    }
}
 
分享到:
评论
1 楼 tyronewj 2016-03-23  
正好我用来转义微博信息

相关推荐

    java 中文Unicode转换

    将中文字符转换为Unicode编码,可以使用`Character`类的`toChars()`方法,或者直接通过字符串的`codePointAt()`方法获取码点,然后以"\u"开头的十六进制格式表示。例如: ```java String chineseStr = "你好"; for ...

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

    4. **`String.getBytes(Charset charset)`**:将字符串转换为指定字符集(如 UTF-8)的字节数组。要将中文字符转换为 Unicode 字节序列,可以使用 `getBytes("UTF-8")`。 现在,我们来看 `unicodeConvert.java` 类...

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

    - 返回一个由汉字转换后的英文字符组成的字符串。 - **实现细节**: - 使用 `getBytes()` 方法获取字符串的字节数组。 - 遍历字节数组,检查每个字节是否小于0(即非ASCII字符)。 - 如果是负数,则使用位运算 `...

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

    首先,它将输入的十六进制字符串转换为字节数组,然后使用这些字节尝试以UTF-8、UTF-16(与Unicode相同)、UTF-16LE(小端字节序)、UTF-16BE(大端字节序)、UTF-32以及各自的LE和BE版本进行解码。`str2all`方法则...

    Unicode和字符串

    处理Unicode字符串时,需要注意编码和解码的过程。编码是将字符转换为字节序列,解码则相反,将字节序列转换回字符。不同的编码方式可能导致同样的字符有不同的字节表示,例如,同一个汉字在GBK编码和UTF-8编码下的...

    java字符串的各种编码转换

    在Java中,处理不同字符集之间的字符串转换是一项常见任务。尤其是在处理国际化应用时,理解并掌握各种字符编码格式变得尤为重要。下面将介绍几种常见的字符编码格式以及如何在Java中实现它们之间的转换。 #### 1. ...

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

    这个工具类主要用于解决中文字符串与unicode码之间的转换问题,提供了escape和unescape两个函数,分别用于将中文字符串转换为unicode码和将unicode码转换回中文字符串。 在了解这个工具类之前,我们需要了解什么是...

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

    中文转Unicode码和Unicode码转中文的过程在Java环境下可以通过`native2ascii`工具轻松实现,这个工具是Java开发工具包(JDK)的一部分。 **中文转Unicode码**: 1. 首先,你需要确保已经安装了Java JDK。JDK包含了...

    字符串与Unicode互转工具

    在进行转换时,可以使用 TEncoding.GetString 和 TEncoding.GetBytes 方法,前者将字节数组转换为字符串,后者将字符串转换为字节数组。 总的来说,“字符串与Unicode互转工具”是一个非常实用的编程工具,它帮助...

    Unicode 转换为字符串小工具

    这个"Unicode转换为字符串小工具"是专门用于处理Unicode编码的实用程序,帮助用户将Unicode编码转换为可读的字符串形式。这对于处理包含多种语言或者特殊字符的数据时非常有用,比如网页编码问题、文本解析、数据...

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

    #### 三、字符串转换为Unicode编码 在Java中,可以通过遍历字符串中的每一个字符,然后获取每个字符对应的Unicode值,并将其转换为十六进制表示来实现这一转换过程。 ```java public static String stringToUnicode...

    C++将文本字符串转换成BMP图片

    本篇文章将深入探讨如何使用C++编程语言将文本字符串转换成BMP(Bitmap)图片。 首先,我们需要了解BMP文件格式。BMP是Windows操作系统中常见的位图文件格式,它存储的是未经压缩的像素数据,包括图像宽度、高度、...

    GBK内码字符串转Unicode字符串

    GBK编码的字符串转换为Unicode字符串的过程,通常涉及以下几个步骤: 1. 首先,读取GBK编码的字节流。 2. 使用GBK解码器将GBK编码的字节解码为字符。这一步会得到一个基于GBK编码的字符序列。 3. 将GBK编码的字符...

    JAVA反编译和unicode转字符.rar

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

    Java String字符串和Unicode字符相互转换代码

    以下是一个将Unicode字符串转换回普通字符串的示例: ```java public static String unicode2String(String unicode) { StringBuffer string = new StringBuffer(); String[] hex = unicode.split("\\\\u"); for...

    中文字符Unicode字符转换

    运行环境Java JDK 5.0 Unicode字符转换为中文字符,中文字符转Unicode字符 Unicode字符只支持以\u####格式 &lt;br&gt;MS有人在找这东西,自己也找过,没找着就自己做了一个,功能简单只满足自己的需求:) pp

    Java Unicode 和字符集

    在Java中,字符串是以Unicode的形式存储的,这意味着Java的String类内部使用UTF-16编码来表示字符。Java通过使用`char`类型来表示单个Unicode字符,该类型占用16位,足够表示基本多文种平面上的所有字符。对于超出...

    java 字符串转16进制Ascii

    在Java编程语言中,将字符串转换为16进制ASCII值是一个常见的操作,尤其是在处理数据编码、网络通信或存储时。这个过程涉及到字符到数字的转换,并且通常使用`Character`类和`Integer`类的方法来完成。让我们深入...

    Unicode和汉字互相转换工具

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

    Java做的Unicode编码转换器

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

Global site tag (gtag.js) - Google Analytics