Passing UTF-8 String from C# to Unmanaged C++ DLL

2009/02/05
By

我有個 DLL ,輪入 keystroke 可以傳出文字(不限英文中文)。今年寫了個應用程式,還可以把選出來的文字再傳回去算詞頻。
最近遇到了問題。原先想將 C# 應用程式選出的字串傳進 C++ 寫的 DLL 裡,沒想到傳了老半天,英文(ANSI Str)可以,中文(UTF-8 Str)就是不行。

當我傳入的 string[] 宣告為如下的時候,進去 DLL 的文字(const char **)變亂碼了。

[In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)]

the UTF-8 word will be changed from "丁零当郎" to "^ANH?aj??"

由於我原先的 library 寫的是可以傳一整串陣列的資料進去,不過在這 AP 中,只會用到一個,所以我將問題簡單化。就是我要怎麼在 C# 傳(單一) UTF-8 字串到 C/C++ 的 DLL 呢?

試過了 BStr、LPStr、LPWSTR 等等的,都是亂碼。仔細去看傳入的字串,發現都被當成 Unicode 來處理,所以 3-byte 的字只有 2-byte 進去,這樣當然沒好結果。所以只好回頭想想,來試看看 byte[] 吧。

[DllImport(dllPath)]
        public extern static int WriteSingle(string keystroke, byte[] word);

因為轉成 byte[] ,這樣對於 UTF-8 String 來說我可以這麼做:

System.Text.Encoding.UTF8.GetBytes( selectstr )

所以 function 呼叫時就變成了:

WriteSingle (keystroke, System.Text.Encoding.UTF8.GetBytes( selectstr ));

這樣就解決了傳入 UTF-8 String 到 Unmanaged C++ DLL 的問題了。至於陣列形式的,我還沒試,不過應該是類似的方法吧。

Ref: byte array 的轉換可以參考一下這篇及它的評論

Tags: , ,

2 Responses to Passing UTF-8 String from C# to Unmanaged C++ DLL

  1. Qing on 2009/02/05 at 9:47 下午

    如果 Unmanaged 的 DLL function 其 argument 不是宣告為 const char *, 而是 wchar_t *, 情況又不同了吧 :)

  2. clsung on 2009/02/06 at 8:42 上午

    實驗一下,總是要留下個方法 :p

發表迴響

您的電子郵件位址並不會被公開。 必要欄位標記為 *

*


*