我正在将一些代码从 native C++ 移植到 C#,我需要执行以下操作:
ASCII.GetBytes
当遇到无法识别的 unicode 字符时,它会返回十进制数 63(问号)的字符,但在我的 C++ 代码中使用 WideCharToMultiByte(CP_ACP, . ..
当它遇到一个它不知道的字符时,它使用十进制数字 37(% 符号)的字符。
我的问题是如何让 ASCII.GetBytes 对于未知字符返回 #37 而不是 #63?
最佳答案
在 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
}
}
关于C# ASCII GetBytes如何设置使用哪个字符进行无法识别的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4695448/