如何从UTF-8编码文件中删除无效字符?

时间:2016-12-01 16:32:50

标签: c# unicode encoding utf-8 character-encoding

解释

在编写我的网络应用程序时,我遇到了一个边缘案例。我接受UTF-8文件上传,我已经检查确认它是UTF-8编码(或者至少是最好的检查,显然没有银弹,我知道有很多关于该特定问题的Stack Overflow的其他问题。)

作为测试,我采用ANSI编码文件并将其转换为UTF-8(在单独的测试中)将其转换为Notepad ++中的UTF-8,并且仅将其解码为UTF-8(即使它是ANSI )使用Encoding.UTF.GetBytes(inputStream)在C#中动态实现。

问题出现的地方

稍后,我将文件的原始数据作为XML文件中的一个元素。这就是出现问题的地方。似乎一个字符从ANSI文件中持久存在(我假设)在UTF-8中无效。当我尝试使用以下命令加载XML时...

XDocument xmlSample = XDocument.Load(outputPath);

我得到了这个例外......

{"Invalid character in the given encoding. Line 10, position 14."}

在Visual Studio中看起来像这样......

VSImg

在Notepad ++中就像这样...

NPPImg

下面是字符副本并粘贴。

来自NPP:¡来自Visual Studio字符串查看器:

问题

如何从UTF-8编码文件中删除无效字符,或者至少以理智的方式发现它们,以便我可以拒绝该文件?

1 个答案:

答案 0 :(得分:0)

首先,对于您的示例,“温度”一词表示违规字符实际上是“度”符号(°,Unicode 176),因此全文显示为“温度(°C)”。在这种情况下,字符将被编码为ANSI中的\260字节和UTF-8中的两个字节\302\260\260(在本例中以左括号开头)不是有效的UTF-8。

第二 - 如果您在一年多之后仍然感兴趣 - 您是否可以澄清如何使用Encoding.UTF.GetBytes()“将文件解码为UTF-8?”GetBytes()读取字符,而不是字节,以及C#中的字符没有编码;在读取文件并将其转换为字符时应用了编码。 UTF.GetBytes()所做的是编码(不是解码)将字符转换为UTF-8字节序列。

为了检查传入的字节序列,您可以使用Encoding.UTF.GetChars()将字节序列解码为字符。根据您使用的构造函数,您可以获得“已清理”的字符串(如果出现问题则会丢失数据)或在有问题的字节序列上收到DecoderFallbackException,这样您就可以拒绝输入。

相关问题