[utf8编码的byte[]数组转换为String时要注意的问题]

1. 通过socket给Java传递byte[]数组时,utf-8的字节数组在转换为String, Java并不会遇到0就停止结束,而是一直使用完byte[]的容量,

所以在转换为Java的String需要自己判断字节值是0的位置,再截取数组长度。

 [cpp] view plaincopyprint?技术分享技术分享

  1. public  static int searchByte(byte[] data, byte value) { 
  2.         int size = data.length; 
  3.         for (int i = 0; i < size; ++i) { 
  4.             if (data[i] == value) { 
  5.                 return i; 
  6.             } 
  7.         } 
  8.         return -1; 
  9.     } 
  10.  
  11. public static void main(String[] args) { 
  12.          
  13.         byte[] info = new byte[10]; 
  14.         info[0] = 0x31; 
  15.         info[1] = 0x31; 
  16.         info[2] = 0; 
  17.         info[3] = 0x1; 
  18.         info[4] = 0x32; 
  19.         info[5] = 0; 
  20.         try { 
  21.             String utf8 = new String(info, "UTF-8"); 
  22.             // 1.这里时数组的大小,而不是2,String即使遇到0也会继续加载到String里. 
  23.             // 输出: 10 
  24.             System.out.println("" + utf8.length()); 
  25.             // 1.输出很奇怪,不会输出不可见字符的占位符 
  26.             // 输出: 112 
  27.             System.out.println(utf8); 
  28.             if (utf8.equalsIgnoreCase("112")) { 
  29.                 // 和112不等,这里不会输出. 
  30.                 System.out.println("It is same with 112"); 
  31.             } 
  32.             byte[] info1 = utf8.getBytes("UTF-8"); 
  33.             // 1. 还原为byte[],发现数据并没有丢失. 
  34.             // 输出: 10:0:1:50 
  35.             System.out.println("info1: " + info1.length + ":" + info1[2] + ":" 
  36.                     + info1[3] + ":" + info1[4]); 
  37.             // 1. 所以如果需要到0结束的utf8字节数组,需要自己判断0并截取. 
  38.             int offset = -1; 
  39.             // binarySearch 必须要数组升序排序了才可以用,所以不能用. 
  40.             // offset = Arrays.binarySearch(info, (byte)0); 
  41.             offset = searchByte(info,(byte)0); 
  42.             String info2 = new String(info, 0, offset, "UTF-8"); 
  43.             // 输出: 11 
  44.             System.out.println("info2: " + info2); 
  45.             // 输出: 2 
  46.             System.out.println("" + info2.length()); 
  47.         } catch (UnsupportedEncodingException e) { 
  48.             // TODO Auto-generated catch block 
  49.             e.printStackTrace(); 
  50.         } 
  51.     } 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。