0

对于客户项目,查询数据库并将结果写入文件。该文件需要在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 子类化,但这对于我从一开始就期望工作的东西来说似乎要工作得多。

4

1 回答 1

1

经过进一步调查,我必须得出结论,Shift JIS是用词不当。相反,这是代码页 932。Unicode 和微软提供了这个和 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,这是预期的结果。

于 2013-01-09T08:17:16.500 回答