注:本例只是用于记录,windows下用的是vs2010,测出来c++宽字符的编码是UTF-16LE。java中char类型的编码是UTF-16BE。
/**
* 将c++的宽字符字符串转换成java字符串
* windows下面, c++的宽字符是UTF-16LE编码,utf16加小端字节序,utf16和utf8一样属于unicode编号的一种实现,
* 不过没有utf8那么智能,utf8能自适应,不会有大端小端之类的。
* 比如 "单桩抗压a" 对应的UTF-16LE编码(16进制)为 5553 6968 9762 8B53 6100 0000
* @param arr c++传过来的宽字节字符串组成的字节数组
*/
public static String getStrFromCppWCharByteArr(byte[] arr){
//arr = ConversionSystemHelper.hexStringToBytes("5553696897628B530000");
if(arr == null){
return "";
}
StringBuilder sb = new StringBuilder();
int loopLen = arr.length;
for(int i = 0; i < loopLen; ){
byte b1 = arr[i];
byte b2 = arr[i + 1];
if(b1 == 0 && b2 == 0){ //结尾了
break;
}
int c1 = (b2 << 8) & 0x0000ffff;
int c2 = b1 & 0x000000ff;
int c3 = c1 | c2;
char c4 = (char) c3;
sb.append(c4);
i = i + 2;
}
System.out.println(sb.toString());
return sb.toString();
}