Hier ist meine Wiedergabe, basierend auf den Antworten von Joan und Marcel. Die Änderungen, die ich vorgenommen habe, sind wie folgt:
- Verwenden Sie eine allgemein akzeptierte Methode, um Akzente zu entfernen.
- Explizites Regex-Caching für bescheidene Geschwindigkeitsverbesserungen.
- Weitere Worttrennzeichen erkannt und auf Bindestriche normalisiert.
Hier ist der Code:
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));
}
}
Dies löst das Problem mit nicht-lateinischen Charakteren immer noch nicht. Eine völlig alternative Lösung wäre die Verwendung von Uri.EscapeDataString , um den String in seine hexadezimale Darstellung umzuwandeln:
string original = "测试公司";
string converted = Uri.EscapeDataString(original);
Verwenden Sie dann die Daten, um einen Hyperlink zu generieren:
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
测试公司
</a>
Viele Browser zeigen chinesische Schriftzeichen in der Adressleiste an (siehe unten), aber aufgrund meiner eingeschränkten Tests wird dies nicht vollständig unterstützt.
HINWEIS: Damit Uri.EscapeDataString auf diese Weise funktioniert, muss iriParsing aktiviert sein.
BEARBEITEN
Für diejenigen, die URL-Slugs in C # generieren möchten, empfehle ich, diese verwandte Frage zu prüfen:
Wie generiert Stack Overflow seine SEO-freundlichen URLs?
Es ist das, was ich letztendlich für mein Projekt verwendet habe.