【发布时间】:2017-04-16 09:27:40
【问题描述】:
解释:
我在编写网络应用程序时遇到了一个极端情况。我接受要上传的 UTF-8 文件,并且我已经进行了检查以确认它是 UTF-8 编码的(或者至少是最好的检查,显然没有灵丹妙药,我知道有很多有关该特定问题的 Stack Overflow 上的其他问题)。
作为测试,我获取了一个 ANSI 编码文件并将其转换为 UTF-8,方法是(在单独的测试中)在 Notepad++ 中将其转换为 UTF-8,并且也仅将其解码为 UTF-8(即使它是 ANSI ) 在 C# 中使用 Encoding.UTF.GetBytes(inputStream) 即时运行。
问题出在哪里:
稍后,我将文件的原始数据作为元素之一放在 XML 文件中。这就是问题出现的地方。似乎 ANSI 文件中保留了一个字符,该字符(我假设)在 UTF-8 中无效。当我尝试使用以下命令加载 XML 时...
XDocument xmlSample = XDocument.Load(outputPath);
我得到了这个异常...
{"Invalid character in the given encoding. Line 10, position 14."}
在 Visual Studio 中看起来像这样...
在记事本++中就像这样......
下面是字符复制粘贴。
来自 NPP:¡ 来自 Visual Studio 字符串查看器:�
问题:
如何从 UTF-8 编码文件中删除无效字符,或者至少以理智的方式发现它们以便拒绝该文件?
【问题讨论】:
-
复制并粘贴字符到问题中,它可能会提供一些线索。
-
XmlReader.Create(string, settings) 你可以添加一个设置参数来忽略字符检查。它并不总是有效,但可能在您的情况下。温度符号在 xml 中不是非法的,只是 Microsoft 实现需要对这些字符进行特殊处理。
-
你能显示原始字符吗?
�(FFFD) 是 Replacement Character:“用于替换传入的字符,其值在 Unicode 中未知或无法表示”,而¡(C2A1) 是 invalid。我假设 Visual Studio 正在用替换字符正确替换,而 npp 正在做一些奇怪的事情。注意可以通过BitConverter.ToString(Encoding.UTF8.GetBytes("�"))获取代码 -
在 Notepad++ 中,您是否使用了 Encode As 或 Convert To 来重新编码? Encode As 仅显示使用新选择的编码从磁盘读取的字节。由于 ANSI 和 UTF-8 在字符 127 以上是不同的,因此可能会产生意想不到的结果。 “编码”菜单中的“转换为”条目实际上采用字符并将它们正确转换为新选择的编码。
-
您目前如何检查 UTF-8 有效性?看来这个测试还不够彻底。
标签: c# unicode encoding utf-8 character-encoding