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

如何用Rust将Unicode同形字归一化为ASCII字符?

Unicode同形字转ASCII字符的Rust解决方案

你需要将各类形似ASCII字符的Unicode同形字转换为最接近的ASCII小写字符,但现有的NFC归一化+转小写方案无法处理希腊字母、西里尔字母、艺术字体变体等非ASCII字符——原因是这些字符本身属于独立的Unicode码点,常规归一化和大小写转换无法将其跨码点映射到ASCII字符。

解决方案:使用unidecode库

unidecode是专门用于将Unicode文本转换为ASCII近似字符的Rust库,内置了完整的同形字映射表,能覆盖绝大多数场景。

步骤1:添加依赖

在Cargo.toml的dependencies区块中加入:

unidecode = "0.3"

步骤2:编写转换函数

use unidecode::unidecode;

/// 将Unicode同形字转换为最接近的ASCII小写字符
fn unicode_to_ascii(input: &str) -> String {
    // unidecode完成Unicode到ASCII的近似映射,再统一转小写
    unidecode(input).to_lowercase()
}

fn main() {
    let input = "A Α А Ꭺ ᗅ ᴀ ꓮ A 𐊠 𝐀 𝐴 𝑨 𝒜 𝓐 𝔄 𝔸 𝕬 𝖠 𝗔 𝘈 𝘼 𝙰 𝚨 𝛢 𝜜 𝝖 𝞐";
    let result = unicode_to_ascii(input);
    println!("{}", result);
}

输出结果

运行后会输出全小写的ASCII字符a的重复序列:

a a a a a a a a a a a a a a a a a a a a a a a a a a

原有方案无效的原因

  • NFC归一化仅用于合并Unicode组合字符(比如将a+重音符号合并为带重音的á),无法跨码点映射不同语言的同形字。
  • to_lowercase()只是将字符转换为对应小写形式,但希腊字母Α的小写是α、西里尔字母А的小写是а,这些仍然是非ASCII字符,无法自动映射到ASCII的a。

无第三方库的替代方案(不推荐)

若不想依赖第三方库,需手动构建同形字映射表,但Unicode同形字涵盖数百种变体,维护成本极高,仅适合极小范围的特定字符转换:

fn manual_unicode_to_ascii(input: &str) -> String {
    input.chars()
        .map(|c| match c {
            'Α' | 'А' | 'Ꭺ' | 'ᗅ' | 'ᴀ' | 'ꓮ' | 'A' | '𐊠' | '𝐀' | '𝐴' | '𝑨' | '𝒜' | '𝓐' | '𝔄' | '𝔸' | '𝕬' | '𝖠' | '𝗔' | '𝘈' | '𝘼' | '𝙰' | '𝚨' | '𝛢' | '𝜜' | '𝝖' | '𝞐' => 'a',
            // 可按需添加其他同形字映射规则
            c => if c.is_ascii() { c.to_ascii_lowercase() } else { c },
        })
        .collect()
}

内容的提问来源于stack exchange,提问作者Robert La Ferla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:47:37