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

时间:2011-01-14 20:11:42

标签: c# c++ unicode encoding ascii

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

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

我的问题是我如何制作ASCII.GetBytes给我#37而不是#63的未知字符?

2 个答案:

答案 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