`
312350968
  • 浏览: 209370 次
  • 性别: 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转换

    Java中文成Unicode码及从Unicode码转成中文

    中文字符Unicode字符转换

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

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

    当需要对一个unicode十六进制字符串进行编码时,首先做的应该是确认字符集编码格式,在无法快速获知的情况下,通过一下的str4all方法可以达到这一目的

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

    主要为大家详细介绍了Java实现中文字符串与unicode互转的工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java中字符串转unicode

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

    Java进制/时间/日期/字符串/流算法大全

    Java 的16 进制与字符串的相互转换函数 JAVA 时间格式化处理 将毫秒转化为日期 文本的倒序输出 判断一个数字是奇数还是偶数 用Hibernate 实现分页 35 选7 彩票程序 获取GMT8 时间 中文乱码转换 Big5 字与Unicode 的...

    利用Java开源库把汉字转拼音

    pinyin4j能够根据中文字符获取其对应的拼音,而且拼音的格式可以定制。 pinyin4j是一个支持将中文...支持多种字符串输出格式,比如支持Unicode格式的字符ü和声调符号(阴平 "ˉ",阳平"ˊ",上声"ˇ",去声"ˋ")的输出。

    利用Java代码实现无字符+中文转换为全中文的代码

    //将字符串存入StringBuffer中 BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); isr.close(); ...

    兼容C# VB.net的TripleDES加解密的java源码

    坑3:Java的字符串转字节数组,getBytes函数无参时默认为utf-8,汉字占三字节,英文字符占1字节;若指定参数为unicode,则转换后前二字节为-2,-1,后两字节为一个字符(高位在前,低位在后);而DotNET转换后,无前...

    JAVA_API1.6文档(中文)

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    CharsetUtils.java

    * 字符编码工具类 , 主要方法:1)获取传入字符串的编码格式 2)根据新的编码格式生成新字符串 /** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */ US_ASCII("US-ASCII","位ASCII字符,也叫作ISO...

    常用编码(Unicode,UTF-8,GBK)转换工具

    用于常用编码转换,包括BREW、JAVA等语言UNICODE字符串定义格式,网页编码,GBK及UTF-8的URL编码等

    Java 1.6 API 中文 New

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...

    java 算法

    数组和数组之间的转换代码,从资源文件里读取值的类,一个随机类,计算传入值是否星期六,为RootPaneContainer组件添加键盘事件,将数组转成字符串 在调试或记录日志时用到,转换文件大小,多线程的世界时钟,显示...

    java反编译工具 jad

    -8 - 将Unicode字符转换为ANSI字符串,如果输出字符串是中文的话一定要加上这个参数才能正确显示。 最常用的反编译指令如下所示: Jad –d c:\\javasource –s .java -8 javatest.class 这条指令将当前目录下的...

    transliteration:Java的音译Maven模块。 它将unicode文本中的特殊字符转换为相应的ascii字母,并支持几乎所有常见的语言,包括CJK(中文,日文和韩文)

    它将unicode文本中的特殊字符转换为相应的ascii字母,并支持几乎所有常见语言,包括CJK(中文,日文和韩文)。 从Node.js模块移植: : 安装 上传到Maven代表-TO GO现在只编译本地存储库 用法 添加Maven依赖项:...

    android字符串中文显示工具

    将java中\u7535\u8111\u5f00\u673a\u663e\u793a\u84dd\u5c4f乱码转换成中文显示出来。

    java_字符串判断工具类的标准代码_android

    将字符串转移为Unicode码 对象是否为无效值 是否包含中文字符 对象是否为无效值 参数是否是有效数字 (整数或者小数) 匹配到第一个字符串 参数是否是有效整数 字符串参数是否是double 判断一个对象是否为boolean...

    JavaAPI1.6中文chm文档 part1

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    java发送短信之AT指令

    * 向串口中写进字符串命令 * @param s 字符串命令 * @throws Exception 异常 */ public void writeln(String s) throws Exception { out.write(s); out.write('\r'); out.flush(); } /** * 读取COM命令...

Global site tag (gtag.js) - Google Analytics