2011-01-14 55 views
3

我移植從本地C++到C#的一些代碼,我需要做到以下幾點:C#ASCII GetBytes如何設置哪個字符用於無法識別的轉換?

ASCII.GetBytes當它遇到一個它不承認它返回到我與十進制數63(問號)字符Unicode字符,但在我的C++代碼使用WideCharToMultiByte(CP_ACP, ...遇到一個字符時,它不知道它使用十進制數字37(%符號)的字符。

我的問題是我如何使ASCII.GetBytes返回給我#37而不是#63爲未知的字符?

回答

6

在C#中,您可以使用編碼的DecoderFallback/EncoderFallback來決定它的行爲方式。您不能更改本身的回退,但可以克隆它,然後設置回退。這裏有一個例子:

using System; 
using System.Text; 

class Test 
{  
    static void Main() 
    { 
     Encoding asciiClone = (Encoding) Encoding.ASCII.Clone(); 
     asciiClone.DecoderFallback = new DecoderReplacementFallback("%"); 
     asciiClone.EncoderFallback = new EncoderReplacementFallback("%"); 

     byte[] bytes = { 65, 200, 66 }; 
     string text = asciiClone.GetString(bytes); 
     Console.WriteLine(text); // Prints A%B 
     bytes = asciiClone.GetBytes("A\u00ffB"); 
     Console.WriteLine(bytes[1]); // Prints 37 
    } 
} 
0

推測C++代碼調用WideCharToMultiBytelpDefaultChar = "%"

有沒有辦法將此傳遞給Encoding.GetBytes調用,但您可以使用P/Invoke調用WideCharToMultiByte

+0

不幸的是,C++字符串在數據庫中,並已轉換。所以我從C++中獲得了數百萬個這些已經轉換的字符串,我需要保持與C#一樣的向前移動。 – Brian 2011-01-14 20:17:21

+0

更糟糕的是,這是一個SQL注入C#DLL不是一個正常的C#DLL,所以我不認爲我可以P /調用WideCharToMultiByte。 – Brian 2011-01-14 20:18:33

相關問題