我正在将一些代码从本机C ++移植到C#,我需要执行以下操作:
ASCII.GetBytes
当遇到unicode字符时它无法识别它会返回给我带有十进制数字63(问号)的字符,但是在遇到字符时使用WideCharToMultiByte(CP_ACP, ...
的C ++代码中它没有'知道它使用十进制数37(%符号)的字符。
我的问题是我如何制作ASCII.GetBytes给我#37而不是#63的未知字符?
答案 0 :(得分:6)
在C#中,您可以使用编码的DecoderFallback
/ EncoderFallback
来确定其行为方式。您无法更改Encoding.ASCII
本身的后备,但您可以克隆它,然后设置后备。这是一个例子:
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
}
}
答案 1 :(得分:0)
据推测,C ++代码使用WideCharToMultiByte
调用lpDefaultChar = "%"
。
无法将此传递到Encoding.GetBytes
来电,但您可以使用P / Invoke调用WideCharToMultiByte
。