如何使用C#将非ASCII字符转为URL合规的a-z/0-9格式ASCII字符?
解决URL友好字符串转换的问题
我明白你需要把各种字符串转换成仅含a-z和0-9的格式用于网站URL,之前用Normalize方法没达到预期效果对吧?这很正常,Normalize主要是处理Unicode字符的标准化,没法直接搞定非拉丁字母和特殊符号的转换,我给你梳理下可行的方案和对应规则。
核心要求
用于网站URL的字符必须仅包含小写a-z和0-9,其他字符要么替换为对应拉丁字母,要么直接移除。
你的示例对应的转换规则
从示例里能明确你要的转换逻辑:
- 带变音符号的拉丁字母:替换成无变音的基础字母
/københavn→/koebenhavn/köln→/koln
- 特殊符号(比如单引号):直接移除
/k'ton→/kton
- 非拉丁字母(西里尔文、中文等):全部移除,路径部分为空
/привет→ (缺失)/北京市→ (缺失)
实现思路(以C#为例)
要实现这个逻辑,得结合Normalize和字符过滤两步来:
- 先用Normalize把带变音的字符分解成“基础字母+变音标记”的形式
- 遍历每个字符,只保留基础拉丁字母和数字,其他所有字符(包括变音标记、非拉丁字母、特殊符号)全部忽略
- 最后把结果统一转成小写
给你写个简单的实现代码:
using System.Text; using System.Globalization; public static string ConvertToUrlFriendly(string input) { // 标准化字符,分解变音符号 var normalizedStr = input.Normalize(NormalizationForm.FormD); var resultBuilder = new StringBuilder(); foreach (char c in normalizedStr) { var charCategory = CharUnicodeInfo.GetUnicodeCategory(c); // 只保留小写字母、大写字母和数字,其他都跳过 if (charCategory == UnicodeCategory.LowercaseLetter || charCategory == UnicodeCategory.UppercaseLetter || charCategory == UnicodeCategory.DecimalDigitNumber) { // 统一转成小写 resultBuilder.Append(char.ToLowerInvariant(c)); } } return resultBuilder.ToString(); }
测试这个方法的话,刚好能得到你示例里的结果:
- 输入
københavn→ 输出koebenhavn - 输入
köln→ 输出koln - 输入
k'ton→ 输出kton - 输入
привет→ 输出空字符串 - 输入
北京市→ 输出空字符串
这样就完全满足你的需求啦。
内容的提问来源于stack exchange,提问作者Philip Rossen
相关产品推荐
相关产品推荐

