【问题标题】:DecoderFallbackException trouble getting correct characterDecoderFallbackException 获取正确字符时遇到问题
【发布时间】:2015-04-16 15:29:23
【问题描述】:

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

“奶油甜甜圈,1.00 美元”

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

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

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

我想向用户报告是什么字符导致了差异。

最好的方法是什么?

如果我返回 Encoding.UTF8.GetString(ex.UnknownBytes),它将返回 Unicode 替换字符而不是“è”。想必这是因为“232”作为单字节是无效的。

我错过了什么?似乎我拥有对用户有所帮助所需的所有信息,但我无法传达这些信息。

【问题讨论】:

    标签: c# unicode utf-8


    【解决方案1】:

    我看到了问题。在我的示例中,我使用“è”作为外来字符。这是 ANSI 中的 \xE8,但 UTF8 中是 \xC3\xA8。如果我尝试以 UTF8 或任何我相信的 Unicode 编码呈现 \xE8,它不会知道我在要求什么,因为 \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);
    }
    

    【讨论】:

    • 为反对票感到遗憾。我认为这对试图理清编码异常中返回的字节数组的含义的人很有帮助。我强调我的答案在我的情况下有效,因为 Encoding.Default 在我的上下文中是 Windows 代码页 1252 并且将上传到我的平台的值很可能来自相同的代码页,因此我可以输出一个可识别的值给最终用户。 YMMV。
    • 我赞成您的回答,因为我觉得您不应该这样做。但是您的解决方案不是解决方案,它仅有助于调试(请参阅有问题的字符串)。
    猜你喜欢
    • 2020-09-21
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多