精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

五月婷婷亚洲综合| 佐佐木明希电影| 国产日本在线观看| 美女视频一区二区三区| 美女少妇精品视频| 91视频啊啊啊| 欧洲亚洲精品久久久久| 亚洲一级二级在线| 日韩av在线电影观看| 国产精品伊人久久| 亚洲三级免费| 日韩在线视频免费观看| gogo亚洲国模私拍人体| 日韩伦理在线一区| 综合欧美一区二区三区| 精品久久sese| 夜夜嗨aⅴ一区二区三区| 欧美全黄视频| 中文字幕在线视频日韩| 日韩av无码一区二区三区不卡 | 日韩在线黄色| 在线播放视频一区| 情侣黄网站免费看| 香蕉成人app免费看片| youjizz在线视频| 欧美亚洲福利| 日韩欧美在线视频日韩欧美在线视频| 自拍另类欧美| 黄色av网址在线免费观看| 国产精品12区| 国产日韩欧美电影在线观看| 99热只有这里有精品| 亚洲mv大片欧洲mv大片| 亚洲人成五月天| 国产a√精品区二区三区四区| 欧美日韩国产网站| 精品久久久久久电影| 久久久久福利视频| 黄视频网站在线看| 国产精品色哟哟| 欧美乱偷一区二区三区在线| 日本黄色一区二区三区| 国产精品88av| 亚洲v日韩v综合v精品v| 国产又粗又猛又黄又爽无遮挡| 久久久久一区| 国产成人精品一区二区| 在线免费黄色av| 亚洲在线观看| 日韩美女视频免费看| 日本久久综合网| 亚洲免费网址| 日本久久久久久久久久久| 国产精品免费av一区二区| 亚洲午夜一级| 97久久精品人人澡人人爽缅北| 久久精品国产av一区二区三区| 欧美日韩国产欧| 欧美激情a在线| 亚洲一区 视频| 亚洲激情欧美| 青草热久免费精品视频| 一级做a爰片久久毛片| 老司机午夜精品视频| 国产精品成人aaaaa网站| 天天天天天天天干| 少妇人妻无码专区视频| 天堂av中文在线观看| 色综合久久久网| 色综合天天色综合| 亚洲爽爆av| 日韩久久久精品| 亚洲成人av免费在线观看| 妖精视频一区二区三区| 日韩一区二区在线观看| 无码国产69精品久久久久网站| 人体久久天天| 伊人久久综合97精品| 91视频综合网| 亚洲精品乱码| 国产国语videosex另类| 一本久道久久综合无码中文| 国产精品一区二区久久精品爱涩| 成人性色av| 黄色的视频在线免费观看| 自拍偷在线精品自拍偷无码专区| 免费在线黄网站| 欧美大片1688| 91精品国产综合久久香蕉麻豆| 不许穿内裤随时挨c调教h苏绵| 色88888久久久久久影院| 一区二区欧美久久| 欧美成人综合色| 国产一区91| 成人免费xxxxx在线观看| 懂色av蜜臀av粉嫩av分享吧| 久久久不卡影院| 中文字幕色呦呦| 欧美艳星kaydenkross| 9191成人精品久久| a视频免费观看| 婷婷综合在线| 琪琪第一精品导航| 国产xxxx在线观看| 久久久久久久久久久久久久久99| 大桥未久一区二区三区| 日日av拍夜夜添久久免费| 欧美一区二区三区成人| 精品无码人妻一区| 欧美va亚洲va日韩∨a综合色| 日韩女优在线播放| 亚洲AV无码精品国产| 久久久久久久久久美女| 日本中文字幕在线视频观看| 日韩av懂色| 亚洲欧洲日韩国产| 国产大片aaa| 激情五月婷婷综合| 日韩精品欧美专区| 国产高清中文字幕在线| 日韩一区二区在线播放| 蜜桃av免费观看| 99精品老司机免费视频| 99人久久精品视频最新地址| 91亚洲精品久久久| 国产日韩精品在线看| 精品久久中文字幕| 午夜影院福利社| 99视频精品视频高清免费| 热re91久久精品国99热蜜臀| 深爱激情五月婷婷| 亚洲制服丝袜av| 亚洲第一色av| 欧美肥老太太性生活| 国产第一区电影| 免费一级在线观看| 精品免费在线视频| 在线精品一区二区三区| 亚洲大胆在线| 国产免费一区二区| wwww亚洲| 亚洲精品电影网| 日本少妇吞精囗交| 成人高清视频在线| 国产精品视频二| 日韩精品免费视频一区二区三区 | 日本高清视频在线播放| 日本久久一区二区| 精品人伦一区二区三电影| 久久成人一区| 欧美欧美一区二区| 东京一区二区| 国产午夜精品免费一区二区三区| 日韩在线视频不卡| 国产亚洲短视频| 一级特黄性色生活片| 精品久久不卡| 国产日产亚洲精品| 免费在线观看黄色网| 制服丝袜成人动漫| 成人免费毛片东京热| 国产91精品一区二区麻豆亚洲| 777久久精品一区二区三区无码 | 图片区小说区区亚洲五月| 婷婷午夜社区一区| 中文字幕欧美日韩精品| 91成人在线免费| 亚洲精品国产无套在线观| 自拍偷拍激情视频| 99日韩精品| 日日噜噜噜噜夜夜爽亚洲精品| 日本一区免费网站| 精品久久久av| 欧美一级性视频| 欧美日韩一区免费| 女教师淫辱の教室蜜臀av软件| 韩国精品一区二区| 成人一对一视频| 欧美精品系列| 444亚洲人体| 国产v日韩v欧美v| 一区二区欧美在线| 精品国产av一区二区三区| 五月激情丁香一区二区三区| 制服 丝袜 综合 日韩 欧美| 精品制服美女久久| 人妻av中文系列| 成人一区二区| 亚洲综合最新在线| 午夜激情电影在线播放| 少妇av一区二区三区| www.黄色av| 色8久久精品久久久久久蜜| 日韩欧美综合视频| 91视频国产观看| 日韩精品在线播放视频| 校园激情久久| japanese在线播放| 精品一级毛片| 久久99精品久久久久久久久久| 国产资源一区| 91精品国产色综合| 精品欧美色视频网站在线观看| 日韩精品在线观看视频| 国产女无套免费视频| 色综合久久久久综合体桃花网| 亚洲av鲁丝一区二区三区 | 永久免费看片直接| 91在线精品一区二区三区| 欧美成年人视频在线观看| 一道本一区二区| 中国 免费 av| 精品盗摄女厕tp美女嘘嘘| 国产富婆一区二区三区 | 激情五月综合色婷婷一区二区| 青青久久精品| 日韩av快播网址| a'aaa级片在线观看| 久久夜色精品国产| 搞黄视频在线观看| 亚洲精品综合久久中文字幕| 亚洲精选一区二区三区| 9191国产精品| 92久久精品一区二区| 色偷偷久久人人79超碰人人澡| 免费在线视频观看| 中文字幕一区二区在线播放| 国产精品天天干| 91污片在线观看| 亚洲免费观看在线| 国产精品亚洲午夜一区二区三区 | 久久久999精品免费| 国产小视频在线观看| 日韩精品在线播放| 在线观看xxx| 亚洲精品短视频| 日韩在线视频观看免费| 欧美mv日韩mv亚洲| 国产www免费观看| 日韩精品一区二区三区在线观看| 国产精品伦一区二区三区| 欧美午夜精品理论片a级按摩| 国产又大又粗又爽| 色天使色偷偷av一区二区| 中文字幕国产在线观看| 欧美丝袜一区二区| 狠狠人妻久久久久久| 日本道在线观看一区二区| 国产免费a视频| 欧美影院一区二区三区| 黄色网址中文字幕| 在线亚洲一区二区| 最近中文字幕免费观看| 精品视频在线视频| 一区二区视频播放| 69堂国产成人免费视频| hs视频在线观看| 欧美大片一区二区| 黄色三级网站在线观看| 亚洲韩国日本中文字幕| 人人九九精品| 一区二区三区高清国产| 欧美jizz18hd性欧美| 欧美精品日韩www.p站| 波多野结依一区| 57pao精品| 日韩三区在线| 97夜夜澡人人双人人人喊| 国产伦精品一区二区三区免费优势 | av电影天堂一区二区在线| 91精品人妻一区二区| 国产精品视频在线看| 日本a级片视频| 亚洲超碰精品一区二区| 中文字幕免费观看| 在线播放欧美女士性生活| 丰满人妻一区二区三区免费| 日韩美女av在线| 1区2区3区在线观看| 精品自拍视频在线观看| 午夜伦理福利在线| 国产色视频一区| 4438全国亚洲精品观看视频| 欧美日韩精品不卡| 91精品91| 欧美女人性生活视频| 久久精品国产一区二区三区免费看| 少妇性l交大片7724com| 久久精品一区八戒影视| 国产免费一区二区三区四区| 天天操天天色综合| 一级特黄aaa大片| 精品亚洲夜色av98在线观看| 日本视频不卡| 欧美亚洲国产另类| 偷拍自拍亚洲| 久久久一本精品99久久精品66| 欧美肥老太太性生活| 奇米精品一区二区三区| 精品一区二区三区影院在线午夜| 又黄又色的网站| 中文字幕不卡在线| 日本高清www免费视频| 欧美日韩综合在线| 欧美 日韩 国产 在线| 色偷偷9999www| 美女18一级毛片一品久道久久综合| 91深夜福利视频| 精品高清在线| 国产成人黄色片| 大美女一区二区三区| 亚洲一级理论片| 色综合久久六月婷婷中文字幕| 丰满人妻一区二区三区无码av| 日韩在线视频播放| 一二区成人影院电影网| 精品国产免费一区二区三区| 我不卡伦不卡影院| 色悠悠久久综合网| 久久久久国产精品免费免费搜索| 久久综合综合久久| 欧美精品乱人伦久久久久久| 国产小视频在线播放| 91黄色8090| 中文字幕区一区二区三| 精品中文字幕久久久久久| 国产一级免费观看| 欧美高清视频不卡网| 成人影视在线播放| 欧美又大粗又爽又黄大片视频| 91成人在线精品视频| 99re8这里只有精品| 久久国产福利国产秒拍| 久久视频精品在线观看| 日本精品视频一区二区| 人成免费电影一二三区在线观看| 国内精品久久久久久中文字幕| 香港久久久电影| 日韩不卡视频一区二区| 国产一区二区三区在线观看免费| 日本美女bbw| 欧美私人免费视频| 岛国在线视频| 国产精品久久久久99| 欧洲激情视频| 超碰超碰在线观看| 国产精品女同一区二区三区| 中日韩在线观看视频| 中文字幕欧美亚洲| 国产亚洲欧美日韩精品一区二区三区| 亚洲国产日韩美| 麻豆成人免费电影| 欧美性生交大片| 欧美一区二区视频观看视频| a视频在线观看免费| 999视频在线免费观看| 欧美日韩少妇| 国产 xxxx| 色美美综合视频| 一区二区高清不卡| 成人高清视频观看www| 欧美视频日韩| 三级电影在线看| 在线观看亚洲专区| 日本亚洲精品| 91嫩草国产在线观看| 日韩午夜av| 国产综合精品在线| 欧美高清性hdvideosex| 在线免费观看a视频| 国产日韩精品一区观看| 免费在线亚洲| 最新av电影网站| 亚洲第一偷拍网| 3d性欧美动漫精品xxxx软件| 亚洲美女搞黄| 国产宾馆实践打屁股91| 西西44rtwww国产精品| 一区国产精品视频| 免费观看亚洲视频大全| 五十路熟女丰满大屁股| 久久九九久久九九| 国产裸体无遮挡| 欧美亚洲第一区| 一区二区国产在线| 中文字幕无码人妻少妇免费| 欧美中文字幕一区| 午夜伦理在线视频| 欧美在线日韩精品| 国产一区二区精品久久| 全部毛片永久免费看| 日韩最新av在线| 久久精品福利| 色91精品久久久久久久久| 午夜视频在线观看一区二区| 日本中文字幕在线2020| 精品国产91亚洲一区二区三区www| 免费成人性网站| 日韩精品久久久久久久酒店| 日韩中文娱乐网|