Voici mon interprétation, en fonction de Jeanne et Marcel réponses. Les modifications que j'ai apportées sont comme suit:
- Utiliser un largement acceptée méthode pour supprimer les accents.
- Explicite de la Regex de la mise en cache de modestes améliorations de la vitesse.
- Plus de séparateurs de mots reconnus et normalisés pour les traits d'union.
Voici le code:
public class UrlSlugger
{
// white space, em-dash, en-dash, underscore
static readonly Regex WordDelimiters = new Regex(@"[\s-–_]", RegexOptions.Compiled);
// characters that are not valid
static readonly Regex InvalidChars = new Regex(@"[^a-z0-9\-]", RegexOptions.Compiled);
// multiple hyphens
static readonly Regex MultipleHyphens = new Regex(@"-{2,}", RegexOptions.Compiled);
public static string ToUrlSlug(string value)
{
// convert to lower case
value = value.ToLowerInvariant();
// remove diacritics (accents)
value = RemoveDiacritics(value);
// ensure all word delimiters are hyphens
value = WordDelimiters.Replace(value, "-");
// strip out invalid characters
value = InvalidChars.Replace(value, "");
// replace multiple hyphens (-) with a single hyphen
value = MultipleHyphens.Replace(value, "-");
// trim hyphens (-) from ends
return value.Trim('-');
}
/// See: http://www.siao2.com/2007/05/14/2629747.aspx
private static string RemoveDiacritics(string stIn)
{
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int ich = 0; ich < stFormD.Length; ich++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(stFormD[ich]);
}
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
}
Ce n'est toujours pas résolu non latine question de caractère. Un tout autre solution serait d'utiliser des Uri.EscapeDataString pour convertir la chaîne de sa représentation hexadécimale:
string original = "测试公司";
// %E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8
string converted = Uri.EscapeDataString(original);
Ensuite utiliser ces données pour générer un lien hypertexte:
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
测试公司
</a>
De nombreux navigateurs afficher des caractères Chinois dans la barre d'adresse (voir ci-dessous), mais d'après mon test limitée, il n'est pas complètement pris en charge.
REMARQUE: pour Uri.EscapeDataString travailler de cette façon, iriParsing doit être activé.
MODIFIER
Pour ceux qui cherchent à générer l'URL de Limaces en C#, je vous recommandons de vérifier cette question:
Comment Débordement de Pile générer son SEO-friendly URLs?
C'est ce que j'ai utilisé pour mon projet.