Ini adalah rendisi saya, berdasarkan jawaban Joan dan Marcel. Perubahan yang saya lakukan adalah sebagai berikut:
- Gunakan metode yang diterima secara luas untuk menghilangkan aksen.
- Caching Regex eksplisit untuk peningkatan kecepatan sederhana.
- Lebih banyak pemisah kata yang dikenali dan dinormalisasi menjadi tanda hubung.
Ini kodenya:
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));
}
}
Ini masih belum menyelesaikan masalah karakter non-latin. Solusi yang sepenuhnya alternatif adalah menggunakan Uri.EscapeDataString untuk mengonversi string representasi hex-nya:
string original = "测试公司";
string converted = Uri.EscapeDataString(original);
Kemudian gunakan data untuk membuat hyperlink:
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
测试公司
</a>
Banyak browser akan menampilkan karakter bahasa Mandarin di bilah alamat (lihat di bawah), tetapi berdasarkan pengujian terbatas saya, itu tidak sepenuhnya didukung.
CATATAN: Agar Uri.EscapeDataString bekerja dengan cara ini, iriParsing harus diaktifkan.
EDIT
Bagi mereka yang ingin menghasilkan Siput URL di C #, saya sarankan untuk memeriksa pertanyaan terkait ini:
Bagaimana Stack Overflow menghasilkan URL yang ramah SEO?
Inilah yang akhirnya saya gunakan untuk proyek saya.