Algorithm: 字符串转换为 unicode 字节数组

只要牵扯到字符编码的编程,脾气就会异常的发火,看着那一堆堆乱码,就巴不得拿刀砍死它!


现在有个这样的需求:


使用打印机打印指定的内容,然后按照指定的协议与设备通信。

该打印机认识 unicode 编码的字符。


所以,需要将指定内容(String)转换为 unicode 编码,然后转换为对应的 unicode 字节数组。


编码实现:


/**
	 * 将字符串转换为 unicode 字符.
	 * 
	 * @param src
	 *            要转换的字符串.
	 * @return byte[] 字符串的字节数组.
	 * @throws NullPointerException
	 *             输入的字符串为空时,抛出该异常.
	 * @throws IllegalArgumentException
	 *             转义字符如 \t,在做为参数是应该是 \\t,否则程序报异常.
	 */
	public static byte[] string2Unicode(String src)
			throws NullPointerException, IllegalArgumentException {
		if (src == null) {
			throw new NullPointerException("the parameter of src is Null");
		}

		// 定义常量: 空格
		final String SPACE = " ";
		// 定义常量: 16 进制
		final int RADIX_HEX = 16;

		if ("".equals(src)) {
			src = src + SPACE;
		}

		// 字符串长度
		final int len = src.length();
		// 字符串转换为字符数组
		char[] utfChar = src.toCharArray();
		System.out.println("utfChar length = " + utfChar.length);
		String hexStr = "";
		// 返回值(unicode字符编码是两个字节)
		byte[] result = new byte[len * 2];

		for (int i = 0; i < len; i++) {
			// 转换为16进制
			hexStr = Integer.toHexString(utfChar[i]);
			// System.out.println("hexStr = " + hexStr);
			// 英文字符需要在前面补加数字 00
			if (hexStr.length() > 1 && hexStr.length() <= 2) {
				hexStr = "00" + hexStr;
			} else { // 如果转义字符写错(如\t应该是\\t),报此异常
				// continue;
				throw new IllegalArgumentException(
						"the parameter of src is error, and you'd better check escaped character.");
			}
			// 截取字符串
			String head = hexStr.substring(0, 2);
			String tail = hexStr.substring(2, 4);
			try {
				// 16进制数转换为byte
				result[i * 2] = (byte) Integer.parseInt(head, RADIX_HEX);
				result[i * 2 + 1] = (byte) Integer.parseInt(tail, RADIX_HEX);
			} catch (NumberFormatException nfe) {
				continue;
			}
		}

		return result;
	}


测试用例:


public static void main(String[] args) {
		String src = "UNICODE\\t\\n\\rG OD";
		System.out.println(src);
		byte[] xx;
		try {
			xx = DataUtil.string2Unicode(src);
			int size = xx.length;
			
			for(int i=0;i<size; i++) {
				System.out.println("xx[" + i + "]= " + xx[i]);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}



在线转换工具测试结果(16 进制):


\u55            ----------------------- 'U'

\u4e            ----------------------- 'N'

\u49            ----------------------- 'I'

\u43            ----------------------- 'C'

\u4f             ----------------------- 'O'

\u44            ----------------------- 'D'

\u45            ----------------------- 'E'

\u5c\u74    ----------------------- '\t'

\u5c\u6e    ----------------------- '\n'

\u5c\u72    ----------------------- '\r'

\u47            ----------------------- 'G'

\u20            ----------------------- ' '(空格)

\u4f            ----------------------- 'O'

\u44            ----------------------- 'D'


测试案例测试结果:


xx[0]= 0    xx[1]= 85                             ----------------------- 'U'
xx[2]= 0    xx[3]= 78                            ----------------------- 'N'
xx[4]= 0    xx[5]= 73                            ----------------------- 'I'
xx[6]= 0    xx[7]= 67                            ----------------------- 'C'
xx[8]= 0    xx[9]= 79                            ----------------------- 'O'
xx[10]= 0  xx[11]= 68                           ----------------------- 'D'
xx[12]= 0  xx[13]= 69                           ----------------------- 'E'


xx[14]= 0  xx[15]= 92                            ----------------------- '\t'
xx[16]= 0  xx[17]= 116


xx[18]= 0  xx[19]= 92                            ----------------------- '\n'
xx[20]= 0 xx[21]= 110


xx[22]= 0 xx[23]= 92                            ----------------------- '\r'
xx[24]= 0 xx[25]= 114


xx[26]= 0 xx[27]= 71                            ----------------------- 'G'
xx[28]= 0 xx[29]= 32                            ----------------------- ' '
xx[30]= 0 xx[31]= 79                            ----------------------- 'O'
xx[32]= 0 xx[33]= 68                            ----------------------- 'D'


实现代码缺陷(目前发现的):


需要转义的字符一定要使用这种形式:\\t


测试结果一致,打烊!









评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值