我正在编写一个需要友好 url 的 Web 应用程序,但我不确定如何处理非 7 位 ASCII 字符。我也不想用 URL 编码的实体替换重音字符。是否有允许这种转换的 C# 方法,或者我是否需要实际映射出我想要处理的每一个案例?
7 回答
我不知道如何在 C# 中做到这一点,但你想要的神奇词汇是“Unicode 分解”。有一种标准方法可以分解像“é”这样的组合字符,然后您应该能够过滤掉非 ASCII 字符。
编辑:这可能是您正在寻找的。
使用 UTF-8:
非 ASCII 字符必须首先根据 UTF-8 [STD63] 进行编码,然后必须对相应 UTF-8 序列的每个八位字节进行百分比编码才能表示为 URI 字符。— RFC 3986
有类似的内容:URL 路由:创建友好 URL 时处理空格和非法字符
不过,我不推荐自动转换。在进行此类更改时,某些单词可能会改变含义。你可以把一个好词变成一个不恰当的词。
好的——这里有一些很好的答案。这些方法会奏效。但是,我不得不质疑你的基本前提。我假设您正在讨论的这些值基本上是查询字符串参数,是吗?这是必须过滤掉特殊字符的最常见原因。
两三年来,我使用字符串编码/解码方法通过查询字符串传递这样的东西。总是有间歇性的问题,因为——该死——有很多不同的可能的特殊字符,以及一个浏览器与另一个浏览器中的问题,等等。我们的方法没有这里概述的那么复杂,但仍然如此。2005 年,在对我正在开发的大部分系统进行重写期间,我们决定改为只通过查询字符串传递 id 值。这种方法效果非常好,我想不出它有什么缺点。如果你有一个数据库后端,无论如何,你已经为几乎每个字符串附加了一个 id。如果这是用于搜索等,您可以随时通过表单发送 - 或者您可以使用 AJAX 解决方案
Those methods aren't going to be the best for every situation -- there is no magic bullet here any more than anywhere else -- but this approach has been simple and very functional for me and my team, and so I think it's something for you to at least consider.
好吧,我认为这很简单,这些字符并不多,您可以使用字符串类的 Replace() 方法很容易地替换字符串中的那些字符。
此链接可能会有所帮助: http: //www.codeproject.com/KB/cs/UnicodeNormalization.aspx
private string LatinToAscii(string InString)
{
string newString = string.Empty, charString;
char ch;
int charsCopied;
for (int i = 0; i < InString.Length; i++)
{
charString = InString.Substring(i, 1);
charString = charString.Normalize(NormalizationForm.FormKD);
// If the character doesn't decompose, leave it as-is
if (charString.Length == 1)
newString += charString;
else
{
charsCopied = 0;
for (int j = 0; j < charString.Length; j++)
{
ch = charString[j];
// If the char is 7-bit ASCII, add
if (ch < 128)
{
newString += ch;
charsCopied++;
}
}
/* If we've decomposed non-ASCII, give it back
* in its entirety, since we only mean to decompose
* Latin chars.
*/
if (charsCopied == 0)
newString += InString.Substring(i, 1);
}
}
return newString;
}
(在浏览器中复制/粘贴,它有效吗?)