这可能是一个非常愚蠢的问题,但到目前为止,互联网已经让我失望了,所以我希望你们的优秀人才会有所帮助。基本上我有一个网站,其中有使用.net会员提供商的会员功能(注册/登录/忘记密码等)。接下来,我将用户注册数据转换为XML,然后在逻辑中使用其他地方。不幸的是,我经常会遇到XML格式的问题,而不是hexadecimal value 0x1C, is an invalid character
。我确实找到了一篇关于解决方案的方便的博客文章,但它让我思考,是否有关于如何对数据进行消毒的标准?什么让注册和什么不通过?
答案 0 :(得分:1)
假设您(手动?)反序列化注册输入,在进一步处理之前需要encode it as XML,以便正确转义具有XML特殊含义的字符。
请注意,它们中只有5个,因此通过手动替换完成此操作非常合理:
<
= <
>
= >
&
= &
"
= "
'
= '
您可以使用内置.NET函数HttpUtility.HtmlEncode(input)
为您执行此操作。
<强>更新强>:
我刚刚意识到我没有真正回答你的问题,你似乎正在寻找一种方法将Unicode字符转换为ASCII支持的Html实体。
我不知道.NET中有任何内置函数可以做到这一点,所以我写了一个小实用程序方法来说明这个概念:
public static class StringUtilities
{
public static string HtmlEncode(string input, Encoding source, Encoding destination)
{
var sourceChars = HttpUtility.HtmlEncode(input).ToArray();
var sb = new StringBuilder();
foreach (var sourceChar in sourceChars)
{
byte[] sourceBytes = source.GetBytes(new[] { sourceChar });
char destChar = destination.GetChars(sourceBytes).FirstOrDefault();
if (destChar != sourceChar)
sb.AppendFormat("&#{0};", (int)sourceChar);
else
sb.Append(sourceChar);
}
return sb.ToString();
}
}
然后,如果输入字符串中包含保留的XML字符和Unicode字符,您可以像这样使用它:
string unicode = "<tag>some proӸematic text<tag>";
string escapedASCII = StringUtilities.HtmlEncode(
unicode, Encoding.Unicode, Encoding.ASCII);
// Result: <tag>some proӸematic text<tag>
如果您需要在多个地方执行此操作,为了清理它,您可以为特定方案添加扩展方法:
public static class StringExtensions
{
public static string ToEncodedASCII(this string input, Encoding sourceEncoding)
{
return StringUtilities.HtmlEncode(input, sourceEncoding, Encoding.ASCII);
}
public static string ToEncodedASCII(this string input)
{
return StringUtilities.HtmlEncode(input, Encoding.Unicode, Encoding.ASCII);
}
}
然后你可以这样做:
string unicode = "<tag>some proӸematic text<tag>";
// Default to Unicode as input
string escapedASCII1 = unicode.ToEncodedASCII();
// Pass in a different encoding for your input
string escapedASCII2 = unicode.ToEncodedASCII(Encoding.BigEndianUnicode);
更新#2
由于您还要求提供有关遵守标准的建议,我可以告诉您的最多是您需要考虑输入文本实际结束的位置。
如果某个用户的输入只会显示给该用户(例如,当他们在您的应用中管理他们的个人资料/帐户设置时),并且您的数据库支持Unicode,那么您可以按原样保留所有内容。 / p>
另一方面,如果信息可以显示给其他用户(例如,当用户可以查看彼此的公开个人资料信息时),那么您需要考虑到并非所有用户都将在设备上访问您的网站/支持Unicode的浏览器。在这种情况下,UTF-8可能是您最好的选择。
这也是您无法真正找到有用信息的原因。如果世界能够就标准达成一致,那么我们就不必首先处理所有这些编码变化。想想你的目标群体以及他们需要什么。