精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JNI和C++通信中文亂碼的問題

開發 后端
從Java1.1開始,JNI標準成為Java平臺的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它并不妨礙你使用其他語言,只要調用約定受支持就可以了。

首先,需要明確幾個關于編碼的基本概念:

◆  java內部是使用的16bit的unicode編碼(utf-16)來表示字符串的,無論英文還是中文都是2字節;

◆ jni內部是使用utf-8編碼來表示字符串的,utf-8是變長編碼的unicode,一般ascii字符是1字節,中文是3字節;

◆ c/c++使用的是原始數據,ascii就是一個字節,中文一般是GB2312編碼,用2個字節表示一個漢字。

jni的中文字符串處理

先從字符流的方向分別對java-->C++和C++-->java進行分析

◆ java-->C++

這種情況下,java調用的時候使用的是utf-16編碼的字符串,jvm把這個參數傳遞給jni,C++得到的輸入是jstring,此時,可以利用jni提供的兩種函數,一個是GetStringUTFChars,這個函數將得到一個UTF-8編碼的字符串;另一個是GetStringChars這個將得到UTF-16編碼的字符串。無論那個函數,得到的字符串如果含有中文,都需要進一步轉化成GB2312的編碼。

  1.        String  
  2.       (UTF-16)  
  3.           |  
  4. [java]    |  
  5. --------------------  JNI 調用  
  6. [cpp]     |  
  7.           v  
  8.        jstring  
  9.        (UTF-16)  
  10.           |     
  11.  +--------+---------+   
  12.  |GetStringChars    |GetStringUTFChars  
  13.  |                  |  
  14.  v                  v  
  15. wchar_t*           char*  
  16. (UTF_16)           (UTF-8) 

◆  c/c++ –> java

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

  1.        String  
  2.       (UTF-16)   
  3.           ^   
  4.           |  
  5. [java]    |  
  6. --------------------  JNI 返回  
  7. [cpp]     |       jstring  
  8.        (UTF-16)  
  9.           ^  
  10.           |  
  11.  +--------+---------+  
  12.  ^                  ^  
  13.  |                  |  
  14.  |NewString         |NewStringUTF  
  15. wchar_t*          char*  
  16. (UTF_16)          (UTF-8) 

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

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

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

具體的轉換函數,linux和win32都有一定的支持,比如glibc的mbstowcs就可以用來把 GB2312編碼轉成UTF16,但是這種支持一般是平臺相關的(因為c/c++的標準中并沒有包括這部分),不全面的(比如glibc就沒有提供轉成 UTF8的編碼),不獨立的(linux下mbstowcs的行為要受到locale設置的影響)。所以我推薦使用iconv庫來完成轉換。

iconv庫是一個免費的獨立的編碼轉換庫,支持很多平臺,多種編碼(事實上,它幾乎可以處理我們所使用的所有字符編碼),而且它的行為不受任何外部環境的影響。iconv在*nix平臺上,基本上是缺省安裝的。在win32平臺上需要額外安裝。

下面提供一個把GB2312編碼的字符串轉換成UTF8編碼的示例

  1. #include <iconv.h>char* BytesToUtf8(string src, char* dst, int* nout) {    size_t n_in = src.length();    size_t n_out = *nout;        iconv_t c = iconv_open("UTF-8""GB2312");    if (c == (iconv_t)-1) {        cerr << strerror(errno) << endl;        return NULL;}   
  2.    
  3.    
  4. char* inbuf = new char [n_in + 1];  
  5.  if (!inbuf) {  
  6.  iconv_close(c);  
  7.  return NULL;  
  8.  }  
  9.    
  10. strcpy(inbuf, src.c_str());  
  11.  memset(dst, 0, n_out);  
  12.    
  13. char* in = inbuf;  
  14.  char* out = dst;  
  15.  if (iconv(c, &in, &n_in, &out, &n_out) == (size_t)-1) {  
  16.  cerr << strerror(errno) << endl;  
  17.  out = NULL;  
  18.  }  
  19.  else {  
  20.  n_out = strlen(dst);  
  21.  out = dst;  
  22.  }  
  23.    
  24. iconv_close(c);  
  25.  *nout = n_out;  
  26.  delete[] inbuf;  
  27.    
  28. return out;  

補充幾點說明:

1、從jni的接口看,jni提供了UTF16和UTF8兩個系列的字符串處理函數,但是由于jni的文檔中說,jni的內部實現中是用UTF8作為字符串編碼格式的,所以使用UTF8系列比較合適(NewStringUTF/GetStringUTFChars /ReleaseStringUTFChars)

2、使用iconv庫的話,運行環境的設置對于編碼轉換是沒有影響的,但是外層java程序對于字符串的解析依賴于運行環境的locale,所以設置正確的locale對于jni意義不大,但是對整個系統還是必要的。

以上是主要是說明使用第三方庫去解決編碼問題,針對僅在windows平臺下,是可以使用windows提供的相關方法進行編碼轉換的。

使用一下方法可以將jstring轉換為char*,主要用于在C++中接收java傳遞過來的參數時包含中文字符時使用。在轉換過程中已經對編碼進行了轉換,可以正常返回出中文字符。

  1. char * JStringToWindows(JNIEnv * pJNIEnv, jstring jstr)  
  2. {  
  3.     jsize len = pJNIEnv->GetStringLength(jstr);  
  4.     const jchar * jcstr = pJNIEnv->GetStringChars(jstr, NULL);  
  5.     int size = 0;  
  6.     char * str = (char *)malloc(len * 2 + 1);  
  7.     if ((size = WideCharToMultiByte(CP_ACP, 0, LPCWSTR(jcstr), len, str, len * 2 + 1, NULL, NULL)) == 0)  
  8.         return NULL;  
  9.     pJNIEnv->ReleaseStringChars(jstr, jcstr);  
  10.     str[size] = 0;  
  11.     return str;  

注意:以上方法中返回的char*在使用過后需要delete釋放,因為在編碼轉換過程中使用了malloc分配了內存,不釋放會發生內存泄漏。

如果需要在C++中返回中文信息給java,則需要以下方法將char*轉換成jstring。

  1. jstring WindowsTojstring( JNIEnv* env, char* str )  
  2. {  
  3.     jstring rtn = 0;  
  4.     int slen = strlen(str);  
  5.     unsigned short * buffer = 0;  
  6.     if( slen == 0 )  
  7.         rtn = (env)->NewStringUTF(str );   
  8.     else 
  9.     {  
  10.         int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );  
  11.         buffer = (unsigned short *)malloc( length*2 + 1 );  
  12.         if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )  
  13.             rtn = (env)->NewString(  (jchar*)buffer, length );  
  14.     }  
  15.     if( buffer )  
  16.         free( buffer );  
  17.     return rtn;  

根據前面的字符流的分析,和后面提供的轉換方法,基本上可以解決jni中中文參數亂碼的問題。

以上內容部分摘自網絡。屬于個人總結內容。

原文鏈接:http://www.cnblogs.com/bluesky4485/archive/2011/12/13/2285802.html

【編輯推薦】

  1. 從Java的角度理解Ext的extend
  2. Windows 64位環境的Java服務配置
  3. 解讀Java環境變量配置
  4. 利用JavaMail API 解析MIME
  5. 詳細解析Java中抽象類和接口的區別

 

責任編輯:林師授 來源: bluesky的博客
相關推薦

2010-06-07 11:13:46

MySQL中文亂碼

2010-06-09 14:54:29

2010-06-02 16:36:38

連接MySQL中文亂碼

2014-09-19 10:46:36

LuaCC++

2009-06-30 13:49:21

excel文檔Jsp

2018-12-07 08:38:49

代理服務器Web服務器通信

2010-11-09 17:09:23

SQL Server中

2009-11-26 16:30:52

Suse中文亂碼問題

2011-02-24 10:48:51

FireFTP

2010-06-03 10:26:29

開發MySQL中文亂碼

2022-12-06 13:02:27

深度學習AI

2024-03-11 06:05:00

C++字符串

2021-09-23 14:41:58

鴻蒙HarmonyOS應用

2011-06-09 14:13:06

C++JAVA缺省初始化

2012-05-09 09:56:04

WP7亂碼

2011-08-08 10:29:12

MySQL

2010-09-07 16:34:31

統一通信sip

2010-03-18 17:18:12

Python 中文亂碼

2011-04-11 09:43:25

C++C

2009-09-01 15:24:59

C++、C#和JAVA
點贊
收藏

51CTO技術棧公眾號

亚洲网站在线播放| 欧美性xxxx在线播放| 亚洲在线观看视频| 国产在线拍揄自揄拍无码视频| 秋霞午夜一区二区三区视频| 亚洲国产va精品久久久不卡综合| 久久精品日产第一区二区三区| 精品久久久久久久久久久久久久久久 | aiai久久| 欧美午夜精品久久久久久久| 一区二区国产日产| 成人毛片视频免费看| 久久精品1区| 欧美精品性视频| 亚洲人人夜夜澡人人爽| 午夜不卡一区| 精品日本高清在线播放| 欧美aaa在线观看| 视频三区在线观看| 国产乱理伦片在线观看夜一区| 97视频在线观看视频免费视频| 国产1区2区在线观看| jizzjizzjizz欧美| 欧美日韩视频专区在线播放| 成人在线观看你懂的| 日本成a人片在线观看| 成人短视频下载| 国产伦精品免费视频| 日韩精品久久久久久久| 88国产精品视频一区二区三区| 日韩成人高清在线| 最好看的中文字幕| 中文在线8资源库| 亚洲色图制服诱惑| 四虎永久国产精品| 香蕉视频成人在线| 国产91精品一区二区麻豆亚洲| 国产精品嫩草视频| 中国一级免费毛片| 国内精品美女在线观看| 久久婷婷国产麻豆91天堂| 91精彩刺激对白露脸偷拍| 中文字幕亚洲在线观看| 欧美精品色一区二区三区| 北条麻妃av高潮尖叫在线观看| 2021中文字幕在线| 亚洲影视在线观看| 在线观看污视频| 色三级在线观看| 国产欧美精品国产国产专区| 久久精品国产第一区二区三区最新章节 | 亚洲一区二区中文字幕| 中文字幕日本人妻久久久免费 | 中文久久久久久| 黑人巨大精品| 丁香五六月婷婷久久激情| 国产日韩av网站| 久久大胆人体| 亚洲一二三四久久| 国产乱子伦精品无码专区| 国产一二区在线| 亚洲视频资源在线| 中文字幕不卡每日更新1区2区| wwwxxx在线观看| 欧美国产一区二区| 一区二区在线观| 亚洲麻豆精品| 亚洲视频精选在线| 69精品丰满人妻无码视频a片| 超碰人人在线| 有码一区二区三区| 欧美久久久久久久久久久久久| 爱搞国产精品| 欧美日韩国产在线看| 国产在线观看福利| 色综合天天色| 91精品国产入口| 无码人妻aⅴ一区二区三区玉蒲团| 在线视频亚洲欧美中文| 欧美精品一区二区三区一线天视频| 丰满少妇xbxb毛片日本| 天堂网av成人| 在线成人激情黄色| 91麻豆精品成人一区二区| 欧美jjzz| 欧美性受xxxx白人性爽| 天天干天天插天天射| 久久99日本精品| 成人三级视频在线观看一区二区| 涩涩视频免费看| 亚洲国产高清在线| 蜜臀在线免费观看| xx欧美视频| 欧美日韩国产123区| 深夜福利网站在线观看| 成人在线视频中文字幕| 国产午夜精品视频| av激情在线观看| 亚洲女同在线| 91久久久久久久久久| 欧洲av在线播放| 久久久蜜桃精品| 男女爱爱视频网站| 中文av在线全新| 91精品蜜臀在线一区尤物| 亚洲国产精品成人综合久久久| 欧美色婷婷久久99精品红桃| 蜜月aⅴ免费一区二区三区| 中国一级特黄毛片| 久久99精品国产麻豆婷婷 | 伊人久久大香线蕉无限次| 视频直播国产精品| 欧美精品久久久久久久久久久| 涩涩视频在线免费看| 在线电影国产精品| 国产精品一级黄片| 91精品一区国产高清在线gif | 亚洲激情电影中文字幕| 最新av电影网站| 裸体素人女欧美日韩| 91精品久久久久久蜜桃| 成人高潮成人免费观看| 精品女同一区二区三区在线播放| 日韩中文字幕a| 亚洲涩涩av| 欧美激情一二区| 一级做a爰片久久毛片16| 91性感美女视频| 亚洲中文字幕无码一区二区三区| 激情小说亚洲| 亚洲欧美一区二区三区情侣bbw | 欧美日韩美女在线观看| 国产又黄又嫩又滑又白| 欧美激情另类| 国产精品麻豆va在线播放| 性猛交xxxx| 亚洲一区二区五区| 91精品国产三级| 日韩成人综合| 国产精品久久久久久久久| 天堂影院在线| 激情久久av一区av二区av三区| 色婷婷激情视频| 91日韩在线| 国产精品亚洲网站| 成人性生交大片免费看午夜| 色综合久久中文综合久久97| 欧美熟妇精品一区二区蜜桃视频| 中文视频一区| 成人黄色大片在线免费观看| 懂色av中文在线| 日本久久电影网| 国产精品扒开腿做爽爽| 男女精品网站| 欧美日韩一区在线视频| 蜜臀国产一区| 国产一区二区三区欧美| 特级西西444www大胆免费看| 国产午夜精品理论片a级大结局| 黄色国产精品视频| 女厕嘘嘘一区二区在线播放| 国产91露脸中文字幕在线| 你懂的免费在线观看视频网站| 色综合视频一区二区三区高清| 国产熟妇搡bbbb搡bbbb| 久久综合五月| 亚洲精品人成| 国产色99精品9i| 精品久久久久久久久久久院品网| 久久久久久久久毛片| 国产精品亚洲一区二区三区在线| 久久久国内精品| 福利电影一区| 欧美在线观看一区二区三区| 免费在线黄色电影| 欧美色涩在线第一页| www.97视频| 国产成人8x视频一区二区| 野外做受又硬又粗又大视频√| 久久久久久毛片免费看| 日本精品久久久久影院| 98在线视频| 欧美一区二区二区| 日韩人妻无码一区二区三区99| 91香蕉视频mp4| 免费一区二区三区在线观看| 欧美精品一区二区三区久久久竹菊| 国产精品一区视频网站| 波多野结衣久久精品| 色黄久久久久久| 黄色福利在线观看| 欧美在线一二三| 久久网一区二区| 久久久久国产精品麻豆ai换脸| 不卡中文字幕在线观看| 亚洲三级色网| 亚洲视频精品一区| 成人午夜三级| 国产日韩欧美中文| 麻豆mv在线看| 久久综合免费视频| 三区在线观看| 91精品欧美久久久久久动漫 | 国产精品无码网站| 久久精品久久精品| 大j8黑人w巨大888a片| 四虎8848精品成人免费网站| 国产精选一区二区| 久久久加勒比| 777777777亚洲妇女| 欧美成年黄网站色视频| 日韩毛片中文字幕| 精品国产va久久久久久久| 91久久精品一区二区| 久久久久成人精品无码| 日本一二三不卡| 在线免费观看a级片| 国产一区二区三区国产| 日韩精品久久久毛片一区二区| 精品国产亚洲一区二区三区| 国产aⅴ夜夜欢一区二区三区 | 91豆花精品一区| 成人三级网址| 日韩在线观看免费全集电视剧网站 | 亚洲奶水xxxx哺乳期| 在线视频免费一区二区| 亚洲人成色777777老人头| 日韩欧美二区三区| 亚洲综合视频网站| 久久久久久久免费视频了| 女同性αv亚洲女同志| 久久成人羞羞网站| 视色视频在线观看| 久久在线精品| 日韩免费视频播放| 好看的日韩av电影| 蜜臀在线免费观看| 一区二区在线| 中文字幕在线乱| 欧美电影一二区| 伊人久久99| 97色伦图片97综合影院| 一区二区精品国产| 91欧美在线| 一本—道久久a久久精品蜜桃| 青青草原综合久久大伊人精品| 欧美重口乱码一区二区| 亚洲福利网站| 农村寡妇一区二区三区| 免费看日本一区二区| 久久久影院一区二区三区| 日韩精品免费一区二区三区竹菊| 国产伦精品一区二区三区免费视频| **欧美日韩在线| 成人信息集中地欧美| 国产美女精品视频免费播放软件| 91九色国产社区在线观看| 国产精品视频一区二区三区综合| 91系列在线观看| 亚洲精品一二三**| 成人动漫在线观看视频| 国产精品午夜av| 久久av一区二区| 自拍自偷一区二区三区| 日韩电影免费观看在| 清纯唯美日韩| 黄色一级片网址| 欧美精品1区| 欧美视频在线观看网站| 免费看的黄色欧美网站| 亚洲 欧美 另类人妖| 韩国一区二区在线观看| 日本黄色大片在线观看| 不卡的看片网站| 国产黄片一区二区三区| 国产精品久久精品日日| 精品爆乳一区二区三区无码av| 午夜精品福利一区二区三区av| 中文字幕高清在线免费播放| 欧美三片在线视频观看| 99久久精品无免国产免费| 精品成人在线观看| 国产原创av在线| 久久五月天综合| 不卡专区在线| 国产精品香蕉国产| 成人偷拍自拍| 亚洲一区二区精品在线| 一区在线播放| 中国黄色片免费看| 成人动漫精品一区二区| 国产伦精品一区二区三区视频女| 亚洲欧美日韩在线| 中文字幕亚洲乱码熟女1区2区| 欧美日韩黄色一区二区| 国精产品一品二品国精品69xx | 欧美激情视频一区二区三区在线播放 | 亚洲国产精品一区二区久久恐怖片| 中文字幕亚洲乱码熟女1区2区| 在线播放一区二区三区| 色一情一乱一区二区三区| 菠萝蜜影院一区二区免费| 丝袜老师在线| 97久久精品午夜一区二区| 欧美精品久久久久久| 日本中文字幕在线视频观看 | 国产老头和老头xxxx×| 久久精品视频一区二区三区| 日本激情视频一区二区三区| 欧美日韩色婷婷| 精品国产亚洲AV| 中文字幕无线精品亚洲乱码一区| 麻豆蜜桃在线观看| www.av一区视频| 日韩啪啪电影网| 亚洲欧洲成人av每日更新| 欧美一区二区三区成人久久片 | 亚洲 国产 日韩 综合一区| 国产精品成人一区二区网站软件| 北条麻妃视频在线| 成人精品一区二区三区中文字幕| 丁香激情五月少妇| 欧美性猛交xxxx乱大交3| 国产av一区二区三区| 最新中文字幕亚洲| 欧美片第一页| 久久久精品国产一区二区三区| 欧美午夜在线视频| 亚洲最大天堂网| 国产目拍亚洲精品99久久精品| 毛片视频网站在线观看| 精品国产凹凸成av人导航| 老司机在线看片网av| 国产精品自在线| 国产一区二区三区四区二区| 欧美视频在线播放一区| 成人毛片老司机大片| 欧美另类视频在线观看| 欧美一区二区精品在线| 二区三区四区高清视频在线观看| 国产精品视频中文字幕91| 久久99高清| 国产福利视频在线播放| 91丨porny丨首页| 日本视频在线观看免费| 日韩av在线天堂网| 国产在线精彩视频| 狠狠色狠狠色综合人人| 亚洲第一黄色| 久久性爱视频网站| 亚洲成人福利片| 男人天堂网在线视频| 国内精品久久影院| 北条麻妃一区二区三区在线观看| 波多野结衣与黑人| 国产91对白在线观看九色| 伊人365影院| 日韩成人中文电影| 欧美日韩大片| 日韩欧美一区二区三区四区五区 | 亚洲av成人无码网天堂| 69久久夜色精品国产69| 视频一区中文| 天天综合网日韩| 亚洲欧美激情在线| 丰满人妻一区二区| 91tv亚洲精品香蕉国产一区7ujn| 综合国产视频| 中文字幕亚洲影院| 亚洲最大成人综合| 性xxxx18| 国产精品一区二区在线| 影视一区二区| 男人网站在线观看| 色香蕉成人二区免费| 香蕉视频在线播放| 成人性色av| 校园春色综合网| 国产成人精品视频免费| 日韩欧美中文一区| 美女高潮视频在线看| 翔田千里亚洲一二三区| 国产一区二区三区精品欧美日韩一区二区三区 | www.玖玖玖| 中文字幕在线观看一区二区| 国产黄色一级大片| 欧美性受xxxx白人性爽| 四虎8848精品成人免费网站| 人妻体内射精一区二区三区| 在线观看亚洲成人| 少妇视频在线| 日本亚洲导航| 国产91丝袜在线播放九色| 无码人妻一区二区三区免费| 久久久www成人免费精品张筱雨| youjizz欧美| 天天视频天天爽| 精品人伦一区二区三区蜜桃网站| 毛片在线看片| 精品国产一区二区三区麻豆免费观看完整版 |