废话少说,直接上Demo,注释在代码中。
转载地址:http://canofy.iteye.com/blog/718659
package com.weigeli.demo01.util;
import java.io.UnsupportedEncodingException;
import java.util.Locale;
/**
* 实现字符串和Unicode码的互转
*
* @author weigeli
* @version 1.0
* @since 2016年5月24日 下午11:14:36
*/
public class TransUnicode {
/**
* main测试方法
*
* @param args
*/
public static void main(String[] args) {
System.out.println("chinaToUnicode=" + chinaToUnicode("中国abc中国"));
System.out.println("isChinese=" + isChinese('中'));
System.out.println("string2Unicode=" + string2Unicode("中国ABC"));
System.out.println("unicode2String=" + unicode2String("\\U4E2D\\U56FD\\U0041\\U0042\\U0043"));
}
/**
* 将字符串转换为Unicode码【中文】
*
* @param str
* @return string
*/
public static String chinaToUnicode(String str) {
String result = "";
// 循环获取字符串中每一个字符
for (int i = 0; i < str.length(); i++) {
// 当前字符
int chr1 = (char) str.charAt(i);
// 汉字范围 \u4e00-\u9fa5 (中文)
if (chr1 >= 19968 && chr1 <= 171941) {
// 将字符转换为16进制,并转换为大写
result += "\\U" + Integer.toHexString(chr1).toUpperCase(Locale.US);
} else {
// 如果不是汉字,则直接返回原字符
result += str.charAt(i);
}
}
return result;
}
/**
* 判断传入的char字符是否为中文
*
* @param c
* @return boolean
*/
public static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
/**
* 将传入的字符串转换为Unicode码
*
* @param s
* @return string(Unicode)
*/
public static String string2Unicode(String s) {
StringBuffer out = new StringBuffer("");
try {
// 转换为byte数组
byte[] bytes = s.getBytes("unicode");
/*
* 从bytes[2]位开始取值,每一个字符都在数组中占两位
* 每一个数组前一位转换为16进制字符串str1,后一位转换为16进制字符串str2;依次序拼接'\\u'+str1+str2
* 得到一个字符的完整Unicode码
*/
for (int i = 2; i < bytes.length - 1; i += 2) {
out.append("\\u");
// 将前位转换为16进制
// &的位运算保证bytes[i]的前三个字节是0,只有最后一个字节有数(bytes[i]占位4个字节)
String str1 = Integer.toHexString(bytes[i] & 0xff);
// 转换为16进制后默认需要两位,不足两位的用0补齐
for (int j = str1.length(); j < 2; j++) {
out.append("0");
}
out.append(str1);
// 将前位转换为16进制
String str2 = Integer.toHexString(bytes[i + 1] & 0xff);
for (int j = str2.length(); j < 2; j++) {
out.append("0");
}
out.append(str2);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 转换Unicode码为大写,并返回
return out.toString().toUpperCase(Locale.US);
}
/**
* 将传入的Unicode码翻译为字符串
*
* @param unicodeStr
* @return string
*/
public static String unicode2String(String unicodeStr) {
StringBuffer sb = new StringBuffer();
// 将Unicode字符串转换为大写,并以'U'分割为字符串数组
String str[] = unicodeStr.toUpperCase(Locale.US).split("U");
for (int i = 0; i < str.length; i++) {
// 将数组每一个值中的'\'去除
String charStr = str[i].trim().replaceAll("\\\\", "");
// 为空时跳过本次循环
if (charStr.equals(""))
continue;
// 将16进制反转为10进制,并强转为char类型
char c = (char) Integer.parseInt(charStr, 16);
// 将char拼接为目标字符串
sb.append(c);
}
// 返回
return sb.toString();
}
}