Aquí está mi interpretación, basada en las respuestas de Joan y Marcel. Los cambios que hice son los siguientes:
- Utilice un método ampliamente aceptado para eliminar los acentos.
- Almacenamiento en caché explícito de expresiones regulares para mejoras de velocidad modestas.
- Más separadores de palabras reconocidos y normalizados a guiones.
Aquí está el código:
public class UrlSlugger
{
static readonly Regex WordDelimiters = new Regex(@"[\s—–_]", RegexOptions.Compiled);
static readonly Regex InvalidChars = new Regex(@"[^a-z0-9\-]", RegexOptions.Compiled);
static readonly Regex MultipleHyphens = new Regex(@"-{2,}", RegexOptions.Compiled);
public static string ToUrlSlug(string value)
{
value = value.ToLowerInvariant();
value = RemoveDiacritics(value);
value = WordDelimiters.Replace(value, "-");
value = InvalidChars.Replace(value, "");
value = MultipleHyphens.Replace(value, "-");
return value.Trim('-');
}
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));
}
}
Esto todavía no resuelve el problema de los caracteres no latinos. Una solución completamente alternativa sería usar Uri.EscapeDataString para convertir la cadena en su representación hexadecimal:
string original = "测试公司";
string converted = Uri.EscapeDataString(original);
Luego use los datos para generar un hipervínculo:
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
测试公司
</a>
Muchos navegadores mostrarán caracteres chinos en la barra de direcciones (ver más abajo), pero según mis pruebas limitadas, no es completamente compatible.
NOTA: Para que Uri.EscapeDataString funcione de esta manera, iriParsing debe estar habilitado.
EDITAR
Para aquellos que buscan generar slugs de URL en C #, recomiendo consultar esta pregunta relacionada:
¿Cómo genera Stack Overflow sus URL compatibles con SEO?
Es lo que terminé usando para mi proyecto.