DecoderFallbackException无法获得正确的字符

时间:2015-04-16 15:29:23

标签: c# unicode utf-8

假设我有一个带有此输入的文件:

  

“Crèmedonut,$ 1.00”

如果用户上传错误编码为ANSI的文件,并且我使用TextFieldParser()解析它并使用UTF8编码设置为无效字节引发异常,则它将正确地通过异常。它会报告:

  

“无法将索引321处的字节[E8]从指定的代码页转换为Unicode。”

属性“UnknownBytes”包含单个条目[232]的字节数组。 232是E8的十进制等值。奇怪的是,“è”应该是Byte [2] {195,168}我相信。

我想向用户报告哪些字符导致了这种差异。

这样做的最佳方式是什么?

如果我返回Encoding.UTF8.GetString(ex.UnknownBytes),则返回Unicode替换字符而不是“è”。据推测这是因为“232”作为单个字节无效。

我错过了什么?好像我拥有了向用户提供帮助所需的所有信息,但我无法与之沟通。

1 个答案:

答案 0 :(得分:1)

我看到了这个问题。在我的例子中,我使用“è”作为外国人。这是ANSI中的\ xE8,而UTF8中是\ xC3 \ xA8。如果我试图用UTF8渲染\ xE8,或者我相信任何Unicode编码,它就不知道我要求的是什么,因为\ xE8不是代码点U + 00E8的有效十六进制值。

我最终使用以下代码,根据我在服务器上的区域设置,该代码适用于我的情况:

catch (DecoderFallbackException ex) 
{
    var ansiEncoding = Encoding.Default;

    var ansiOutput = ansiEncoding.GetString(ex.BytesUnknown);

    throw new PageException("This file contains unexpected characters. The following character was found in the file: " + ansiOutput);
}