我移植從本地C++到C#的一些代碼,我需要做到以下幾點:C#ASCII GetBytes如何設置哪個字符用於無法識別的轉換?
ASCII.GetBytes
當它遇到一個它不承認它返回到我與十進制數63(問號)字符Unicode字符,但在我的C++代碼使用WideCharToMultiByte(CP_ACP, ...
遇到一個字符時,它不知道它使用十進制數字37(%符號)的字符。
我的問題是我如何使ASCII.GetBytes返回給我#37而不是#63爲未知的字符?
我移植從本地C++到C#的一些代碼,我需要做到以下幾點:C#ASCII GetBytes如何設置哪個字符用於無法識別的轉換?
ASCII.GetBytes
當它遇到一個它不承認它返回到我與十進制數63(問號)字符Unicode字符,但在我的C++代碼使用WideCharToMultiByte(CP_ACP, ...
遇到一個字符時,它不知道它使用十進制數字37(%符號)的字符。
我的問題是我如何使ASCII.GetBytes返回給我#37而不是#63爲未知的字符?
在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
}
}
推測C++代碼調用WideCharToMultiByte
與lpDefaultChar = "%"
。
有沒有辦法將此傳遞給Encoding.GetBytes
調用,但您可以使用P/Invoke調用WideCharToMultiByte
。
不幸的是,C++字符串在數據庫中,並已轉換。所以我從C++中獲得了數百萬個這些已經轉換的字符串,我需要保持與C#一樣的向前移動。 – Brian 2011-01-14 20:17:21
更糟糕的是,這是一個SQL注入C#DLL不是一個正常的C#DLL,所以我不認爲我可以P /調用WideCharToMultiByte。 – Brian 2011-01-14 20:18:33