Скажите, что у меня есть эта веб-страница:
http://ww.xyz.com/Product.aspx?CategoryId=1
Если бы название CategoryId=1 является "Собаками", я хотел бы преобразовать URL во что-то вроде этого:
http://ww.xyz.com/Products/Dogs
Проблема состоит в том, если название категории содержит внешний (или недопустимый для URL) символы. Если названием CategoryId=2 является "Göra äldre", каков должен быть новый URL?
Логически это должно быть:
http://ww.xyz.com/Products/Göra äldre
но это не будет работать. Во-первых из-за пространства (который я могу легко заменить тире, например), но что относительно внешних символов? В Asp.net я мог использовать функцию URLEncode, которая даст что-то вроде этого:
http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre
но я не могу действительно сказать, что это лучше, чем исходный URL (http://ww.xyz.com/Product.aspx?CategoryId=2)
Идеально я хотел бы генерировать этого, но как может, я могу сделать это автоматически (т.е. преобразование внешних символов к 'безопасным' символам URL):
http://ww.xyz.com/Products/Gora-aldre
Я придумал 2 следующих метода расширения (asp.net / C#):
public static string RemoveAccent(this string txt)
{
byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt);
return System.Text.Encoding.ASCII.GetString(bytes);
}
public static string Slugify(this string phrase)
{
string str = phrase.RemoveAccent().ToLower();
str = System.Text.RegularExpressions.Regex.Replace(str, @"[^a-z0-9\s-]", ""); // Remove all non valid chars
str = System.Text.RegularExpressions.Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space
str = System.Text.RegularExpressions.Regex.Replace(str, @"\s", "-"); // //Replace spaces by dashes
return str;
}
Транслитерировать символы, отличные от ASCII, в ASCII, используя что-то вроде этого:
var str = "éåäöíØ";
var noApostrophes = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(str));
=> "eaaoiO"
( Источник )