3

我正在编写一个需要友好 url 的 Web 应用程序,但我不确定如何处理非 7 位 ASCII 字符。我也不想用 URL 编码的实体替换重音字符。是否有允许这种转换的 C# 方法,或者我是否需要实际映射出我想要处理的每一个案例?

4

7 回答 7

3

我不知道如何在 C# 中做到这一点,但你想要的神奇词汇是“Unicode 分解”。有一种标准方法可以分解像“é”这样的组合字符,然后您应该能够过滤掉非 ASCII 字符。

编辑:可能是您正在寻找的。

于 2009-03-04T18:18:05.933 回答
2

使用 UTF-8:

非 ASCII 字符必须首先根据 UTF-8 [STD63] 进行编码,然后必须对相应 UTF-8 序列的每个八位字节进行百分比编码才能表示为 URI 字符。— RFC 3986

于 2009-03-04T18:26:55.520 回答
1

有类似的内容:URL 路由:创建友好 URL 时处理空格和非法字符

不过,我不推荐自动转换。在进行此类更改时,某些单词可能会改变含义。你可以把一个好词变成一个不恰当的词。

于 2009-03-04T18:22:31.320 回答
1

好的——这里有一些很好的答案。这些方法会奏效。但是,我不得不质疑你的基本前提。我假设您正在讨论的这些值基本上是查询字符串参数,是吗?这是必须过滤掉特殊字符的最常见原因。

两三年来,我使用字符串编码/解码方法通过查询字符串传递这样的东西。总是有间歇性的问题,因为——该死——有很多不同的可能的特殊字符,以及一个浏览器与另一个浏览器中的问题,等等。我们的方法没有这里概述的那么复杂,但仍然如此。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.

于 2009-03-04T18:47:18.250 回答
0

好吧,我认为这很简单,这些字符并不多,您可以使用字符串类的 Replace() 方法很容易地替换字符串中的那些字符。

于 2009-03-04T18:20:47.923 回答
0

此链接可能会有所帮助: 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;
}
于 2009-03-04T18:24:09.757 回答
0

http://Montréal.com

(在浏览器中复制/粘贴,它有效吗?)

于 2009-03-04T18:26:00.267 回答