You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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和字符过滤两步来:

  1. 先用Normalize把带变音的字符分解成“基础字母+变音标记”的形式
  2. 遍历每个字符,只保留基础拉丁字母和数字,其他所有字符(包括变音标记、非拉丁字母、特殊符号)全部忽略
  3. 最后把结果统一转成小写

给你写个简单的实现代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:48:04