解释:
在编写我的网络应用程序时,我遇到了一个边缘案例。我接受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中看起来像这样......
在Notepad ++中就像这样...
下面是字符副本并粘贴。
来自NPP:¡
来自Visual Studio字符串查看器:�
问题:
如何从UTF-8编码文件中删除无效字符,或者至少以理智的方式发现它们,以便我可以拒绝该文件?
答案 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
,这样您就可以拒绝输入。