一个汉字是两个字节(gbk),每个都是一个负数,要截取的话如果遇到单个字符就会出现乱码错误。所以通过以下代码实现截取
public static String getString(String str, int len){
byte[] datas = str.getBytes();
//存放汉字字符的个数
int count = 0;
for(int i=0; i<len; i++){
if(datas[i] < 0){
count++;
}
}
//如果为单个,在长度后加一,如果刚好是两个(代表没有半个汉字的问题),正常输出
if(count%2 != 0){
len += 1;
}
return new String(datas,0,len);
}
java字符串转C
//java中的字符串对象 -> c中的字符串指针
char* string2c(jstring jstr,JNIEnv* env)
{
//调用字符串对象的getBytes方法
//通过反射机制
//1.获取class java.lang.String
jclass clazz = (*env)->FindClass(env,"java/lang/String");
//2.获取method getBytes("UTF-8")
jmethodID mid = (*env)->GetMethodID(env,clazz,"getBytes","(Ljava/lang/String;)[B");
//3.jstr java中传递过来的对象
//4.调用 返回字节数组
jbyteArray jba = (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,(*env)->NewStringUTF(env,"UTF-8"));
//把java中字节数组转换成C字节数组(jbyte 就是signed char)
jbyte* datas = (*env)->GetByteArrayElements(env,jba,JNI_FALSE);
//获取数组的长度
jsize len = (*env)->GetArrayLength(env,jba);
char* cstr = malloc(len+1);//加1表示加字符串的结束标记
//拷贝字符串
memcpy(cstr,datas,len);
cstr[len] = "\0";
//释放 字符串获取到的字节数组对象
(*env)->ReleaseByteArrayElements(env,jba,datas,len);
return cstr;
}
public static String getString(String str, int len){
byte[] datas = str.getBytes();
//存放汉字字符的个数
int count = 0;
for(int i=0; i<len; i++){
if(datas[i] < 0){
count++;
}
}
//如果为单个,在长度后加一,如果刚好是两个(代表没有半个汉字的问题),正常输出
if(count%2 != 0){
len += 1;
}
return new String(datas,0,len);
}
java字符串转C
//java中的字符串对象 -> c中的字符串指针
char* string2c(jstring jstr,JNIEnv* env)
{
//调用字符串对象的getBytes方法
//通过反射机制
//1.获取class java.lang.String
jclass clazz = (*env)->FindClass(env,"java/lang/String");
//2.获取method getBytes("UTF-8")
jmethodID mid = (*env)->GetMethodID(env,clazz,"getBytes","(Ljava/lang/String;)[B");
//3.jstr java中传递过来的对象
//4.调用 返回字节数组
jbyteArray jba = (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,(*env)->NewStringUTF(env,"UTF-8"));
//把java中字节数组转换成C字节数组(jbyte 就是signed char)
jbyte* datas = (*env)->GetByteArrayElements(env,jba,JNI_FALSE);
//获取数组的长度
jsize len = (*env)->GetArrayLength(env,jba);
char* cstr = malloc(len+1);//加1表示加字符串的结束标记
//拷贝字符串
memcpy(cstr,datas,len);
cstr[len] = "\0";
//释放 字符串获取到的字节数组对象
(*env)->ReleaseByteArrayElements(env,jba,datas,len);
return cstr;
}