package com.properties;

/**
 * native2ascii.exe Java code implementation.
 * 
 * @author
 * @version 1.0
 */
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;
	}

	public static void main(String[] args) {
		String uni = "\u5185\u5bb9ID\u4e0d\u80fd\u4e3a\u7a7a";
		System.out.println(ascii2Native(uni));
	}

}
最近下载更多
lzh070432  LV1 2019年3月30日
一只特立独行的猪  LV2 2016年12月18日
mingyun  LV24 2015年1月15日
平行的直线  LV3 2015年1月15日
mjtljx  LV42 2014年10月1日
AXIN  LV36 2014年2月13日
菜鸟战斗  LV23 2013年8月22日
最近浏览更多
crosa_Don  LV18 2022年3月31日
dongzhan  LV12 2020年12月22日
jinyanliang  LV1 2019年10月31日
batchina  LV2 2019年10月16日
人间蒸发  LV23 2019年9月19日
lzh070432  LV1 2019年3月30日
xningzzz  LV3 2019年3月19日
727103517 2018年2月7日
暂无贡献等级
junwuxie  LV5 2017年9月18日
没有梦想的咸鱼  LV12 2017年8月6日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友