C#ASCII GetBytes如何设置用于无法识别的转换的字符?

Bri*_*ian 3 c# c++ unicode encoding ascii

我正在将一些代码从本机C++移植到C#,我需要执行以下操作:

ASCII.GetBytes当它遇到一个unicode字符时它无法识别它返回给我带有十进制数字63(问号)的字符但是在我的C++代码中使用WideCharToMultiByte(CP_ACP, ...当它遇到一个字符时它不知道它使用带有十进制数字37的字符(%符号) .

我的问题是如何使ASCII.GetBytes返回#37而不是#63为未知字符?

Jon*_*eet 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
    }
}
Run Code Online (Sandbox Code Playgroud)