欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
jni中字符轉換中文亂碼的處理方法
中字符轉換中文亂碼的處理方法(2007-12-25 10:53:57)


    這兩天在學(xué)習使用jni,在java程序中,調用海量詞典的dll。利用jni的GetStringChars函數和NewString函數時(shí),遇到了中文亂碼的問(wèn)題,折騰了一個(gè)晚上。查閱了一些資料,總結如下:

一.相關(guān)概念
  • java內部是使用16bit的unicode編碼(UTF-16)來(lái)表示字符串的,無(wú)論中文英文都是2字節;
  • jni內部是使用UTF-8編碼來(lái)表示字符串的,UTF-8是變長(cháng)編碼的unicode,一般ascii字符是1字節,中文是3字節;
  • c/c++使用的是原始數據,ascii就是一個(gè)字節了,中文一般是GB2312編碼,用兩個(gè)字節來(lái)表示一個(gè)漢字。

明確了概念,操作就比較清楚了。下面根據字符流的方向來(lái)分別說(shuō)明一下

1、java --> c/c++

這種情況中,java調用的時(shí)候使用的是UTF-16編碼的字符串,jvm把這個(gè)字符串傳給jni,c/c++得到的輸入是jstring,這個(gè)時(shí)候,可以利用jni提供的兩種函數,一個(gè)是GetStringUTFChars,這個(gè)函數將得到一個(gè)UTF-8編碼的字符串;另一個(gè)是 GetStringChars這個(gè)將得到UTF-16編碼的字符串。無(wú)論那個(gè)函數,得到的字符串如果含有中文,都需要進(jìn)一步轉化成GB2312的編碼。示意圖如下:
String 
      (UTF-16)
          |
[java]    |
--------------------  JNI 調用
[cpp]     |
          v
       jstring
       (UTF-16)
          
 +--------+---------+
 |GetStringChars    |GetStringUTFChars
                  |
                  v
wchar_t*           char*
(UTF_16)           (UTF-8)

2、c/c++ --> java

jni返回給java的字符串,c/c++首先應該負責把這個(gè)字符串變成UTF-8或者UTF-16格式,然后通過(guò)NewStringUTF或者NewString來(lái)把它封裝成jstring,返回給java就可以了。

       String 
      (UTF-16)
          ^
          |
[java]    |
--------------------  JNI 返回
[cpp]     |
       jstring
       (UTF-16)
          ^
          
 +--------+---------+
                  ^
                  |
 |NewString         |NewStringUTF
wchar_t*          char*
(UTF_16)          (UTF-8)

    如果字符串中不含中文字符,只是標準的ascii碼,那么使用GetStringUTFChars/NewStringUTF就可以搞定了,因為這種情況下,UTF-8編碼和ascii編碼是一致的,不需要轉換。

    但是如果字符串中有中文字符,那么在c/c++部分進(jìn)行編碼轉換就是一個(gè)必須了。我們需要兩個(gè)轉換函數,一個(gè)是把UTF8/16的編碼轉成GB2312;一個(gè)是把GB2312轉成UTF8/16。

    這里要說(shuō)明一下:linux和win32都支持wchar,這個(gè)事實(shí)上就是寬度為16bit的unicode編碼UTF16,所以,如果我們的 c/c++程序中完全使用wchar類(lèi)型,那么理論上是不需要這種轉換的。但是實(shí)際上,我們不可能完全用wchar來(lái)取代char的,所以就目前大多數應用而言,轉換仍然是必須的。


二。一種轉換方法

使用wide char類(lèi)型來(lái)轉換。

char* jstringToWindows( JNIEnv *env, jstring jstr )
{ //UTF8/16轉換成gb2312
  int length = (env)->GetStringLength(jstr );
  const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
  char* rtn = (char*)malloc( length*2+1 );
  int size = 0;
  size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
  if( size <= 0 )
    return NULL;
  (env)->ReleaseStringChars(jstr, jcstr );
  rtn[size] = 0;
  return rtn;
}

jstring WindowsTojstring( JNIEnv* env, const char* str )
{//gb2312轉換成utf8/16
    jstring rtn = 0;
    int slen = strlen(str);
    unsigned short * buffer = 0;
    if( slen == 0 )
        rtn = (env)->NewStringUTF(str );
    else
    {
        int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
        buffer = (unsigned short *)malloc( length*2 + 1 );
        if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
            rtn = (env)->NewString(  (jchar*)buffer, length );
    }
    if( buffer )
        free( buffer );
    return rtn;
}

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JNI jstring與c++字符串類(lèi)型轉換函數
【轉】Android JNI開(kāi)發(fā)入門(mén)篇
JNI 中文處理問(wèn)題小結
JNI中jstring類(lèi)型與c語(yǔ)言中的字符串的轉換
JNI 數據類(lèi)型轉換
字符編碼轉換_進(jìn)制轉換(GB2312,GBK,JNI,HexTOStr) (轉)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久