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

时间:2023-01-11 14:30:05

本文转自:http://blog.csdn.net/androidbluetooth/article/details/7686760

只要牵扯到字符编码的编程,脾气就会异常的Algorithm: 字符串转换为 unicode 字节数组,看着那一堆堆乱码,就巴不得拿刀砍死它!

现在有个这样的需求:

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

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

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

编码实现:

[java] view plaincopyprint?
  1. /** 
  2.      * 将字符串转换为 unicode 字符. 
  3.      *  
  4.      * @param src 
  5.      *            要转换的字符串. 
  6.      * @return byte[] 字符串的字节数组. 
  7.      * @throws NullPointerException 
  8.      *             输入的字符串为空时,抛出该异常. 
  9.      * @throws IllegalArgumentException 
  10.      *             转义字符如 \t,在做为参数是应该是 \\t,否则程序报异常. 
  11.      */  
  12.     public static byte[] string2Unicode(String src)  
  13.             throws NullPointerException, IllegalArgumentException {  
  14.         if (src == null) {  
  15.             throw new NullPointerException("the parameter of src is Null");  
  16.         }  
  17.   
  18.         // 定义常量: 空格  
  19.         final String SPACE = " ";  
  20.         // 定义常量: 16 进制  
  21.         final int RADIX_HEX = 16;  
  22.   
  23.         if ("".equals(src)) {  
  24.             src = src + SPACE;  
  25.         }  
  26.   
  27.         // 字符串长度  
  28.         final int len = src.length();  
  29.         // 字符串转换为字符数组  
  30.         char[] utfChar = src.toCharArray();  
  31.         System.out.println("utfChar length = " + utfChar.length);  
  32.         String hexStr = "";  
  33.         // 返回值(unicode字符编码是两个字节)  
  34.         byte[] result = new byte[len * 2];  
  35.   
  36.         for (int i = 0; i < len; i++) {  
  37.             // 转换为16进制  
  38.             hexStr = Integer.toHexString(utfChar[i]);  
  39.             // System.out.println("hexStr = " + hexStr);  
  40.             // 英文字符需要在前面补加数字 00  
  41.             if (hexStr.length() > 1 && hexStr.length() <= 2) {  
  42.                 hexStr = "00" + hexStr;  
  43.             } else { // 如果转义字符写错(如\t应该是\\t),报此异常  
  44.                 // continue;  
  45.                 throw new IllegalArgumentException(  
  46.                         "the parameter of src is error, and you'd better check escaped character.");  
  47.             }  
  48.             // 截取字符串  
  49.             String head = hexStr.substring(02);  
  50.             String tail = hexStr.substring(24);  
  51.             try {  
  52.                 // 16进制数转换为byte  
  53.                 result[i * 2] = (byte) Integer.parseInt(head, RADIX_HEX);  
  54.                 result[i * 2 + 1] = (byte) Integer.parseInt(tail, RADIX_HEX);  
  55.             } catch (NumberFormatException nfe) {  
  56.                 continue;  
  57.             }  
  58.         }  
  59.   
  60.         return result;  
  61.     }  


测试用例:

[java] view plaincopyprint?
  1. public static void main(String[] args) {  
  2.         String src = "UNICODE\\t\\n\\rG OD";  
  3.         System.out.println(src);  
  4.         byte[] xx;  
  5.         try {  
  6.             xx = DataUtil.string2Unicode(src);  
  7.             int size = xx.length;  
  8.               
  9.             for(int i=0;i<size; i++) {  
  10.                 System.out.println("xx[" + i + "]= " + xx[i]);  
  11.             }  
  12.         } catch (Exception e) {  
  13.             e.printStackTrace();  
  14.         }  
  15.     }  

在线转换工具测试结果(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

测试结果一致,打烊!