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

标签 c# c++ unicode encoding ascii

我正在将一些代码从 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/

相关文章:

c++ - 仅为具有相同基类的类授予对函数的访问权限

java - JSP:在mysql查询中执行非英文字符

c# - 从 db 查询对象的 db4o 最佳实践

c# - 将事务结果用作参数时的超时错误

C++使用GetPrivateProfileString读取配置文件参数

C++ 内存模型 : do seq_cst loads synchronize with seq_cst stores?

java - 用空间来解释这个奇怪的现象

perl - perl 中的 Unicode,mkdir 练习

c# - 在图表中仅显示大于 0 的值

c# - 是什么导致 DriveInfo.IsReady 为假?