2010-04-24 39 views
3

我有一個C#COM服務器,它被cpp客戶端使用。將字符串從C#傳遞給cpp與COM

其中一個C#方法返回一個字符串。

在cpp中,返回的字符串用Unicode(UTF-16)表示,至少根據內存視圖。

  1. COM字符串總是這樣嗎?
  2. 有沒有辦法使用UTF-8呢?
  3. 我看到一些代碼,其中字符串在cpp和c#之間傳遞爲字節數組。這有什麼好處嗎?
+0

此主題已變成一個沒有吸引力的downvoting巨星與衝突的答案。我建議你在MSDN Library中查找BSTR和SysAllocString的定義,並得出你自己的結論。 – 2010-04-26 16:04:45

回答

0
  1. 是。如果您希望將字符串作爲ANSI字符串而不是Unicode返回,請在C#中的方法定義之前放置the attribute[return: MarshalAs(UnmanagedType.LPStr)]
  2. 是的 - 作者可能已經這樣做,通過側置默認編組行爲來維持對字符串內容編碼的非常細緻的控制。
1
  1. 是的。標準的COM字符串類型是BSTR。它是一個以UTF16編碼的Unicode字符串,就像Windows的本地字符串類型一樣。
  2. 不,COM方法不會理解UTF8字符串,它會將它變成中文。對於文本文件,UTF8是一種很好的編碼方式,而不是用於處理內存中字符串的程序。 UTF8需要1到4個字節之間的任何地方來編碼Unicode碼點。與基本的字符串操作非常不兼容,比如獲取字符的大小或索引。
  3. C和C++程序傾向於使用8位編碼,與「char」類型兼容。這是一個古老的做法,可以追溯到Unicode之前的一個時代。有沒有什麼吸引力,有許多 8位編碼。典型的問題是,作爲文本輸入的數據只能在使用相同8位編碼的程序讀取時正確解釋。換句話說,當計算機相距不足1000英里時。在歐洲較少。
+0

聽起來像你一樣。他正在從C++調用一個C#COM組件。 – sblom 2010-04-24 23:06:22

+0

@sblom:是的,你的回答讓我感到困惑。 COM在兩端看起來都是一樣的。自動化一直啓用Unicode。 – 2010-04-25 08:00:02