需先启用PHP intl扩展再安装php-transliterator,否则会因Class 'Transliterator' not found报错;验证用php -m | grep intl,缺失时按系统安装intl;安装命令须指定版本:PHP7.4+用^2.0,7.2–7.3用^1.1;转换规则如Any-Latin; Latin-ASCII顺序敏感,且ICU版本差异影响结果。

Composer 安装 php-transliterator 前先确认扩展是否可用
直接运行 composer require php-transliterator/php-transliterator 很可能失败——这不是包本身的问题,而是它严重依赖 PHP 的 intl 扩展。若你的环境没启用 intl(比如某些 Docker Alpine 镜像、Mac M1 上用 Homebrew 装的 PHP 默认不带),composer install 会报错:Class 'Transliterator' not found 或提示 ext-intl 缺失。
执行以下命令验证:
php -m | grep intl
若无输出,需先启用或安装 intl:Ubuntu/Debian 运行 sudo apt install php-intl;macOS(Homebrew)执行 brew install icu4c && pecl install intl 并在 php.ini 中添加 extension=intl;Docker Alpine 则需在构建时加 apk add icu-dev 并编译 intl。
composer require 的正确写法与版本选择
官方包名是 php-transliterator/php-transliterator,不是 php-transliterator 或其他变体。当前稳定版为 v2.x(支持 PHP 7.4+),但如果你项目还在用 PHP 7.2–7.3,必须指定旧版:
立即学习“PHP免费学习笔记(深入)”;
- PHP 7.4 及以上:
composer require php-transliterator/php-transliterator:^2.0 - PHP 7.2–7.3:
composer require php-transliterator/php-transliterator:^1.1
v1 和 v2 的 API 一致,但 v2 移除了对已废弃 iconv 回退的支持,更严格依赖 intl。别跳过版本约束,否则 Composer 可能拉取不兼容的预发布版。
基础用法:用 Transliterator::transliterate() 做拉丁化
安装成功后,无需额外 require,Composer 自动加载。最常用场景是把西里尔、希腊、中文拼音等转成 ASCII 字符(即“slug 化”):
$text = "Привет, 你好, Γειά σου";
$result = \Transliterator::transliterate('Any-Latin; Latin-ASCII', $text);
// 输出:"Privet, Ni hao, Geia sou"
关键点:
- 转换规则字符串必须准确,常见组合有:
Any-Latin(泛拉丁化)、Latin-ASCII(去音调符号)、NFD; [:Nonspacing Mark:] Remove; NFC(仅去重音,保留字母) - 规则间用分号连接,顺序敏感——
Latin-ASCII; Any-Latin会失效,因为 ASCII 后无法再 Latin 化 - 若传入空字符串或 null,
transliterate()返回 null,务必做空值判断
生产环境要注意的兼容性陷阱
同一段规则在不同 ICU 版本下结果可能不同。例如 ICU 69+ 支持 el-Latin(希腊语专用拉丁化),而旧版只认 Any-Latin。检查 ICU 版本:
php -r "echo INTL_ICU_VERSION;"
线上服务器和本地开发机 ICU 版本不一致时,测试通过的转换逻辑上线后可能出错。建议:
- 在
composer.json的require中加"ext-intl": "*",并用composer check-platform-reqs校验 - CI 流程中加入 ICU 版本断言,例如
[[ $(php -r "echo INTL_ICU_VERSION;") == "72.1" ]] - 避免使用实验性规则如
und-Latin,优先选Any-Latin这类长期稳定的标识符
ICU 数据库本身不随 PHP 升级自动更新,有些系统需要手动升级 icu-data 包才能支持新语言规则——这点常被忽略。



















