最代码广告位
/*
 *    Copyright 2012-2013 The Haohui Network Corporation
 */
package com.haohui.common.utils;

/**
 * Java Native和Ascii转换代码
 * 
 * @project common-utils
 * @author cevencheng <[email protected]>
 * @create 2012-11-7 下午4:16:57
 */
public class Native2AsciiUtils {
	/**
	 * prefix of ascii string of native character
	 */
	private static String PREFIX = "\\u";

	/**
	 * Native to ascii string. It's same as execut native2ascii.exe.
	 * 
	 * @param str
	 *            native string
	 * @return ascii string
	 */
	public static String native2Ascii(String str) {
		char[] chars = str.toCharArray();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < chars.length; i++) {
			sb.append(char2Ascii(chars[i]));
		}
		return sb.toString();
	}

	/**
	 * Native character to ascii string.
	 * 
	 * @param c
	 *            native character
	 * @return ascii string
	 */
	private static String char2Ascii(char c) {
		if (c > 255) {
			StringBuilder sb = new StringBuilder();
			sb.append(PREFIX);
			int code = (c >> 8);
			String tmp = Integer.toHexString(code);
			if (tmp.length() == 1) {
				sb.append("0");
			}
			sb.append(tmp);
			code = (c & 0xFF);
			tmp = Integer.toHexString(code);
			if (tmp.length() == 1) {
				sb.append("0");
			}
			sb.append(tmp);
			return sb.toString();
		} else {
			return Character.toString(c);
		}
	}

	/**
	 * Ascii to native string. It's same as execut native2ascii.exe -reverse.
	 * 
	 * @param str
	 *            ascii string
	 * @return native string
	 */
	public static String ascii2Native(String str) {
		StringBuilder sb = new StringBuilder();
		int begin = 0;
		int index = str.indexOf(PREFIX);
		while (index != -1) {
			sb.append(str.substring(begin, index));
			sb.append(ascii2Char(str.substring(index, index + 6)));
			begin = index + 6;
			index = str.indexOf(PREFIX, begin);
		}
		sb.append(str.substring(begin));
		return sb.toString();
	}

	/**
	 * Ascii to native character.
	 * 
	 * @param str
	 *            ascii string
	 * @return native character
	 */
	private static char ascii2Char(String str) {
		if (str.length() != 6) {
			throw new IllegalArgumentException("Ascii string of a native character must be 6 character.");
		}
		if (!PREFIX.equals(str.substring(0, 2))) {
			throw new IllegalArgumentException("Ascii string of a native character must start with \"\\u\".");
		}
		String tmp = str.substring(2, 4);
		int code = Integer.parseInt(tmp, 16) << 8;
		tmp = str.substring(4, 6);
		code += Integer.parseInt(tmp, 16);
		return (char) code;
	}
}
最近下载更多
1529245428 LV12月19日
星星
zzwewewe LV12019年7月18日
星星
gkoubei LV12019年7月8日
星星
rogerdzq LV12018年11月14日
星星
340037705 LV12018年8月6日
星星
zhanglle LV12018年4月17日
星星
soft5200 LV302017年6月21日
太阳月亮月亮月亮星星星星
阳光男孩 LV22015年9月14日
星星星星
半叶玫瑰 LV12014年12月18日
星星
PercyQQ LV72014年12月18日
月亮星星星星星星
最近浏览更多
1529245428 LV12月19日
星星
123hdhdhd LV102019年12月1日
月亮月亮星星星星
batchina LV22019年10月16日
星星星星
zzwewewe LV12019年7月18日
星星
gkoubei LV12019年7月8日
星星
zoumuhao LV22019年1月24日
星星星星
规范化 LV342018年12月6日
太阳太阳星星星星
dfdf123 LV22018年11月25日
星星星星
rogerdzq LV12018年11月14日
星星
340037705 LV12018年8月6日
星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友