无效的 UTF-8 字符串在移动端引发的问题
C++ 返回的 char* 字符串(utf-8)中,夹杂了一些无效的字符,在移动端引发了一些问题。表现为:在 Android 端,引发了 JNI 异常:
env->NewStringUTF(data):
JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte 0xe6
而在 iOS 端,则为
[NSString stringWithUTF8String:data]
的返回值为 nil
在 Android 端,这个BUG有人向 google 提交了 issue,暂还没有得在解决。目前的解决办法是多做一步转换,先将 char* 转为 JByteArray,再转成jString:
1 2 3 4 5 6 7 |
//int size, char* data jbyteArray array = (*env)->NewByteArray(env, size); (*env)->SetByteArrayRegion(env, array, 0, size, data); jstring strEncode = (*env)->NewStringUTF(env, "UTF-8"); jclass cls = (*env)->FindClass(env, "java/lang/String"); jmethodID ctor = (*env)->GetMethodID(env, cls, "<init>", "([BLjava/lang/String;)V"); jstring object = (jstring) (*env)->NewObject(env, cls, ctor, array, strEncode); |
而在 iOS端,则可以使用 libiconv 将 UTF-8 字符串转为 GBK,再转为 UTF-8 字符串,转换时,使用 "//IGNORE" 选项忽略无效的字符,即可。