Hi! I’m clsung

Hi! I’m clsung

clsung’s blog site

Hi! I’m clsung RSS Feed
 
 
 
 

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

我有個 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 的轉換可以參考一下 二月 5th, 2009 | Tags: , , | Category: Programming, c++ | Subscribe to comments | Leave a comment | Trackback URL | Visited (896/3193) times

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

  1. 1
    Qing:

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

  2. 2
    clsung:

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

Leave a Reply

噗浪:

  • clsung 說 訂好了訂好了 3 小時 之前
  • clsung 說 累 5 小時 之前
  • clsung 說 被踢爆才肯降價 超收空汙費 中油明起汽柴油降0.1元 2010-02-08

分類

Flickr

    clsung. Get yours at bighugelabs.com/flickr

Blogroll

    馬的警總回來了