C# Unicode上划线(U+;203E)意外转换为Shift JIS

C# Unicode上划线(U+;203E)意外转换为Shift JIS,c#,encoding,shift-jis,C#,Encoding,Shift Jis,对于客户项目,对数据库进行查询,并将结果写入文件。由于该文件稍后将用作另一个遗留系统的输入,因此需要将其保存在中。维基百科的文章指出: 单字节字符0x00到0x7F与ASCII编码匹配,但0x5C处的日元符号(U+00A5)和0x7E处的上划线(U+203E)分别代替ASCII字符集的反斜杠和波浪号除外 在一些测试中,我验证了当日元符号(U+00A5)正确地变成0x5C时,上划线(U+203E)变成0x3F(问号),而不是预期的0x7E 当我使用StreamWriter对文件进行正常输出时,下面

对于客户项目,对数据库进行查询,并将结果写入文件。由于该文件稍后将用作另一个遗留系统的输入,因此需要将其保存在中。维基百科的文章指出:

单字节字符0x00到0x7F与ASCII编码匹配,但0x5C处的日元符号(U+00A5)和0x7E处的上划线(U+203E)分别代替ASCII字符集的反斜杠和波浪号除外

在一些测试中,我验证了当日元符号(U+00A5)正确地变成0x5C时,上划线(U+203E)变成0x3F(问号),而不是预期的0x7E

当我使用StreamWriter对文件进行正常输出时,下面是要复制的最少代码:

    static void Test()
    {
        // Get Shift-JIS encoder.
        var encoding = Encoding.GetEncoding("shift_jis");

        // Declare overline (U+203E).
        char c = (char) 0x203E;

        // Get bytes when encoded as Shift-JIS.
        var bytes = encoding.GetBytes(c.ToString());

        // Expected 0x7E, but the value returned is 0x3F.
    }
这种行为正确吗?
我想我可以将EncoderFallback子类化,但这似乎需要更多的工作来完成一些我从一开始就希望能够完成的工作。

进一步调查后,我必须得出结论,这是一个用词不当的问题。相反,这是一个错误。Unicode和Microsoft在此和Unicode之间提供了一个连接。这显然是用来映射角色的。请注意,它不包含(0x5C,U+00A5)和(0x7E,U+203E)之间的映射

但请注意,我在原始问题中写道“我已经验证了,虽然日元符号(U+00A5)正确地变成了0x5C”。显然,Encoding.GetEncoding(String)方法返回的编码具有定义为System.Text.InternalDecoderBestFitFallback的DecoderFallback,我假设它为一些通常会失败的字符提供了额外的映射。它必须包含日元(U+00A5)的额外映射,但不幸的是,上划线(U+203E)没有。当我用EncoderExceptionFallback替换它时,如果遇到麻烦字符失败

因此,我得出结论,对于Shift JIS,这是一个错误。但对于代码页932,这是预期的结果