Создание строк URL Friendly (например: конвертировать Монреаль в Монреаль) - PullRequest
3 голосов
/ 04 марта 2009

Я пишу веб-приложение, которое требует дружественных URL, но я не знаю, как обращаться с не 7-битными символами ASCII. Я не хочу заменять акцентированные символы на объекты в кодировке URL. Есть ли метод C #, который позволяет такое преобразование, или мне нужно на самом деле отобразить каждый отдельный случай, который я хочу обработать?

Ответы [ 7 ]

3 голосов
/ 04 марта 2009

Я не знаю, как это сделать в C #, но магические слова, которые вы хотите, это "Unicode декомпозиция" Есть стандартный способ разбить составные символы, такие как «é», и тогда вы сможете просто отфильтровать не-ASCII символы.

Редактировать: это может быть то, что вы ищете.

2 голосов
/ 04 марта 2009

Используйте UTF-8:

Non-ASCII сначала необходимо кодировать символы в соответствии с UTF-8 [STD63], а затем каждый октет соответствующей последовательности UTF-8 должен быть в процентах закодирован для представления в виде символов URI. - RFC 3986

1 голос
/ 04 марта 2009

Хорошо, здесь есть несколько хороших ответов. Эти методы будут работать. Тем не менее, я должен поставить под сомнение вашу основную посылку. Я предполагаю, что эти значения, которые вы обсуждаете, в основном должны быть параметрами строки запроса, да? Это самая распространенная причина отфильтровывать специальные символы.

В течение двух или трех лет я использовал подход кодирования / декодирования строк, чтобы пропустить подобные вещи через строку запроса. Всегда были проблемы с перебоями, потому что - черт возьми, - существует так много разных возможных специальных символов, и проблемы в одном браузере по сравнению с другим и т. Д. Наши методы не были такими сложными, как описанные здесь, но все же. В 2005 году, во время переписывания большей части системы, над которой я работал, мы решили перейти только к передаче значений id через строку запроса. Этот подход работал очень хорошо, и я не могу думать о каких-либо недостатках к нему. Если у вас есть база данных, у вас уже есть идентификатор, прикрепленный практически к каждой строке. Если это для поиска или тому подобного, вы всегда можете отправить его через форму сообщения - или вы можете использовать решение AJAX, которое не требует загрузки другой страницы.

Эти методы не будут лучшими в любой ситуации - здесь нет волшебной палочки больше, чем где-либо еще, - но этот подход был простым и очень функциональным для меня и моей команды, и поэтому я думаю, это то, что вы должны хотя бы рассмотреть.

1 голос
/ 04 марта 2009

Эта ссылка может помочь: 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;
}
1 голос
/ 04 марта 2009

Существует нечто похожее на: Маршрутизация URL: обработка пробелов и недопустимых символов при создании дружественных URL

Тем не менее, я не рекомендую автоматическое преобразование. Некоторые слова могут менять значение при выполнении этого типа изменения. Вы можете превратить хорошее слово в неуместное слово.

0 голосов
/ 04 марта 2009

http://Montréal.com

(копировать / вставить в браузер, это работает?)

0 голосов
/ 04 марта 2009

ну, я думаю, это легко, этих символов не так много, их можно легко заменить в строке с помощью метода Replace () класса string.

...