本文转自:http://blog.csdn.net/androidbluetooth/article/details/7686760
只要牵扯到字符编码的编程,脾气就会异常的,看着那一堆堆乱码,就巴不得拿刀砍死它!
现在有个这样的需求:
使用打印机打印指定的内容,然后按照指定的协议与设备通信。
该打印机认识 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
测试结果一致,打烊!