C#調用C/C++DLL收取中文字符處理


C#可以通過P/Invoke調用C/C++寫的DLL,一般在從DLL接收字符串時比較麻煩,本人在某個項目中就遇到這個問題,

從DLL收讀取字符串時遇到中文亂碼,這里總結一下C#收取字符串時的處理。
C/C++字符串一般通過char* 或wchar_t*來表示,char*表示的是ANSCII字符串, wchar_t*表示Unicode字符串,Unicode字符串在C/C++中一個字符占用兩個字節,ANSII字符串一個字符占用一個字節(中文占用兩個字節), 如果C++的接口聲明為char*的入口參數時,C#需要使用byte[] 數組來表示字節緩沖, 注意C#中char 是占用兩個字節的。
比如C++中接口原型
void testStr(char *buf, int size);
 
在C#中作如下的原型聲明
[Dllimport("yourdll.dll")]
extern int testStr(IntPtr buf, int size);
 
作如下調用
byte[] buf = new byte[LEN];
 
int len = testStr(Marshal.UnsafeAddrOfPinnedArrayElement(buf, 0), buf.length);
byte[] cvtBuf = new byte[LEN];
//重點在於這里的轉換 這里是將默認的編碼ANSII轉換為unicode編碼。適用於char* ->unicode
//如果是_TCHAR或wchar_t表示的字符串,不妨用char[]作為緩沖傳入
cvtBuf = Encoding.Convert(Encoding.Default, Encoding.Unicode, buf , 0, len-1);
string recvStr = Marshal.PtrToStringAuto(Marshal.UnsafeAddrOfPinnedArrayElement(cvtBuf , 0));
 
至此中文字符傳入到C#就能正常地顯示了。
 
C++中有個編碼轉換比較有用的函數WideCharToMultiByte和MultiByteToWideChar,可以在MSDN中找到它.
它也是從C/C++動態庫通過JNI向Java傳字符串解決中文亂碼的解決之道。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM