2012-05-11 71 views
0

我有一個非託管代碼調用的接口。它通過一個BSTR類型,但數據是ASCII字符串。當它被寫入文件時,我看到了意想不到的字符。我想到數據如何傳輸非託管[BSTR [ASCII]] - >託管[字符串[ASCII]] - >文件[Unicode [ASCII]],以便輸入處的字符應與輸出處的字符相同。它是否正確?下面是非託管代碼調用的接口函數。使用編組的BSTR類型來傳遞ASCII字符串

//C# interface called by unmanged code 
public void WriteOutFile([In] [MarshalAs(UnmanagedType.BStr)] String asciiData) 
{ 
     File.WriteAllText(fileName, asciiData); 
} 
+1

ascii到BSTR的轉換髮生在本地代碼中。 BSTR是一個unicode字符串。在你的C#方法被調用的時候,對它做任何事情都太遲了。這是C/C++代碼中的一個非常典型的問題,但這是您需要修復的地方。如果你真的絕望,那麼你可以嘗試使用Encoding.Default.GetBytes()轉換回字節並應用正確編碼的GetString()方法。這通常不起作用,因爲原始編碼是有損的。 –

回答

1

首先,.NET字符串永遠的Unicode字符串。您可以使用相應的編碼來獲得具體字符串的任何表示,但字符串中的所有字符都是unicode字符。其次,如果使用的是UnmanagedType.BStr,那麼非託管代碼必須通過BSTR並自己解決字符編碼問題(ASCII是單字節,BSTR是雙字節)。如果不可能,你應該考慮另一種編組方式,例如UnmanagedType.LPStr。