[utf8编码的byte[]数组转换为String时要注意的问题]
1. 通过socket给Java传递byte[]数组时,utf-8的字节数组在转换为String, Java并不会遇到0就停止结束,而是一直使用完byte[]的容量,
所以在转换为Java的String需要自己判断字节值是0的位置,再截取数组长度。
[cpp] view plaincopyprint?
- public static int searchByte(byte[] data, byte value) {
- int size = data.length;
- for (int i = 0; i < size; ++i) {
- if (data[i] == value) {
- return i;
- }
- }
- return -1;
- }
- public static void main(String[] args) {
- byte[] info = new byte[10];
- info[0] = 0x31;
- info[1] = 0x31;
- info[2] = 0;
- info[3] = 0x1;
- info[4] = 0x32;
- info[5] = 0;
- try {
- String utf8 = new String(info, "UTF-8");
- // 1.这里时数组的大小,而不是2,String即使遇到0也会继续加载到String里.
- // 输出: 10
- System.out.println("" + utf8.length());
- // 1.输出很奇怪,不会输出不可见字符的占位符
- // 输出: 112
- System.out.println(utf8);
- if (utf8.equalsIgnoreCase("112")) {
- // 和112不等,这里不会输出.
- System.out.println("It is same with 112");
- }
- byte[] info1 = utf8.getBytes("UTF-8");
- // 1. 还原为byte[],发现数据并没有丢失.
- // 输出: 10:0:1:50
- System.out.println("info1: " + info1.length + ":" + info1[2] + ":"
- + info1[3] + ":" + info1[4]);
- // 1. 所以如果需要到0结束的utf8字节数组,需要自己判断0并截取.
- int offset = -1;
- // binarySearch 必须要数组升序排序了才可以用,所以不能用.
- // offset = Arrays.binarySearch(info, (byte)0);
- offset = searchByte(info,(byte)0);
- String info2 = new String(info, 0, offset, "UTF-8");
- // 输出: 11
- System.out.println("info2: " + info2);
- // 输出: 2
- System.out.println("" + info2.length());
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。