海信家电”换帅 “ 高玉玲接替代慧忠出任新任董事长
2024-11-22
Java中文乱码问题在很多情况下都可能发生:不同应用间,不同平台间等等,但以上问题已有大量优秀的文章讨论过,这里不作深入探讨,详见参考2、3、4、5。下面简要总结一下:
public class Encoding { public static void main(String[] args) { System.out.println(System.getProperty("file.encoding")); } }javac在不指定encoding参数时,如果区域设定不正确,则可能造成编/解码错误,这个问题在编译一个从别的环境传过来的文件时可能发生;
下面重点讨论JNI中在C++程序与Java程序间进行数据传递时需要注意的问题。
在JNI中jstring采用的是UCS-2编码,与Java中String的编码方式一致。但是在C++中,字符串是用char(8位)或者wchar_t(16位,Unicode编码与jchar一致,但并非所有开发平台上都是Unicode编码,详见参考6),下面的程序证明了这一点(编译环境:VC6):
#include <iostream> using namespace std; int main() { locale loc( "Chinese-simplified" ); //locale loc( "chs" ); //locale loc( "ZHI" ); //locale loc( ".936" ); wcout.imbue( loc ); wcout << L"中文" << endl; //若没有L,会出问题 wchar_t wch[] = {0x4E2D, 0x6587, 0x0}; //"中文"二字的Unicode编码 wcout << wch << endl; return 0; }JNI提供了几个方法来实现jstring与char/wchar_t之间的转换。
jsize GetStringLength(jstring str) const jchar *GetStringChars(jstring str, jboolean *isCopy) void ReleaseStringChars(jstring str, const jchar *chars)此外,为了便于以UTF-8方式进行传输、存储,JNI还提供了几个操作UTF格式的方法:
jsize GetStringUTFLength(jstring str) const char* GetStringUTFChars(jstring str, jboolean *isCopy) void ReleaseStringUTFChars(jstring str, const char* chars)GetStringChars返回的是Unicode格式的编码串,而GetStringUTFChars返回的是UTF-8格式的编码串。 要创建一个jstring,可以用如下方式:
jstring NewJString( JNIEnv * env, LPCTSTR str ) { if (!env || !str) return 0; int slen = strlen(str); jchar * buffer = new jchar[slen]; int len = MultiByteToWideChar(CP_ACP, 0, str, strlen(str), buffer, slen); if (len > 0 && len < slen) buffer[len] = 0; jstring js = env->NewString(buffer, len); delete [] buffer; return js; }而要将一个jstring对象转为一个char字符串数组,可以:
int JStringToChar( JNIEnv * env, jstring str, LPTSTR desc, int desc_len ) { int len = 0; if (desc == NULL || str == NULL) return -1; // Check buffer size if (env->GetStringLength(str) * 2 + 1 > desc_len) { return -2; } memset(desc, 0, desc_len); const wchar_t * w_buffer = env->GetStringChars(str, 0); len = WideCharToMultiByte(CP_ACP, 0, w_buffer, wcslen(w_buffer) + 1, desc, desc_len, NULL, NULL); env->ReleaseStringChars(str, w_buffer); if (len > 0 && len < desc_len) desc[len] = 0; return strlen(desc); }当然,按照上面的分析,你也可以直接将GetStringChars的返回结果作为wchar_t串来进行操作。或者,如果你愿意,你也可以将GetStringUTFChars的结果通过MultiByteToWideChar转换为UCS2编码串,再通过WideCharToMultiByte转换为多字节串
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交