对于客户项目,将对数据库进行查询,并将结果写入文件。该文件必须位于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子类化,但是对于我希望从一开始就可以工作的东西来说,这看起来要多得多。
答案 0 :(得分:1)
经过进一步调查,我必须得出结论,Shift JIS是用词不当。相反,这是codepage 932。 Unicode和Microsoft在此与Unicode之间提供mapping table。这显然是用于映射角色的内容。请注意,它不包含(0x5C,U + 00A5)和(0x7E,U + 203E)之间的映射。
请注意,我在原始问题中写道:“我已经验证了,而日元符号(U + 00A5)正确地变为0x5C”。显然,Encoding.GetEncoding(String)方法返回一个编码,其中DecoderFallback定义为System.Text.InternalDecoderBestFitFallback,我假设它为一些通常会失败的字符提供了额外的映射。它必须包含日元(U + 00A5)的附加映射,但遗憾的是没有用于上线(U + 203E)。当我用EncoderExceptionFallback替换它时,如果没有麻烦的话。
因此,我得出结论,对于Shift JIS,这是一个错误。但对于代码页932,这是预期的结果。