假设我有一个带有此输入的文件:
“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”作为单个字节无效。
我错过了什么?好像我拥有了向用户提供帮助所需的所有信息,但我无法与之沟通。
答案 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);
}