【问题标题】:Unexpected conversion of Unicode overline (U+203E) to Shift-JISUnicode 上划线 (U+203E) 到 Shift-JIS 的意外转换
【发布时间】:2013-02-06 00:16:35
【问题描述】:

对于客户项目,查询数据库并将结果写入文件。该文件必须位于Shift JIS 中,因为它稍后会用作另一个旧系统的输入。维基百科文章指出:

单字节字符 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,但是对于我从一开始就期望工作的东西来说,这似乎需要更多的工作。

【问题讨论】:

    标签: c# encoding shift-jis


    【解决方案1】:

    经过进一步调查,我必须得出结论,Shift JIS 是用词不当。相反,这是codepage 932。 Unicode 和 Microsoft 在此和 Unicode 之间提供了一个mapping table。这显然是用来映射字符的。请注意,它不包含 (0x5C, U+00A5) 和 (0x7E, U+203E) 之间的映射。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-21
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多