您的位置:首页 > 编程语言 > Go语言

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

2012-11-26 15:25 429 查看
本文转自:http://blog.csdn.net/androidbluetooth/article/details/7686760

只要牵扯到字符编码的编程,脾气就会异常的

,看着那一堆堆乱码,就巴不得拿刀砍死它!

现在有个这样的需求:

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

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

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

编码实现:

[java] view
plaincopyprint?

/** 

     * 将字符串转换为 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;  

    }  

测试用例:

[java] view
plaincopyprint?

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

测试结果一致,打烊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息