Patchwork UTF-8 完整 API 清单:60+个图形簇感知函数一次讲透(附速查表)
2026/8/24 17:25:23 网站建设 项目流程

Patchwork UTF-8 完整 API 清单:60+个图形簇感知函数一次讲透(附速查表)

【免费下载链接】utf8Portable and performant UTF-8, Unicode and Grapheme Clusters for PHP项目地址: https://gitcode.com/gh_mirrors/ut/utf8

在 PHP 项目中处理中文、emoji 等多字节字符时,strlensubstr等原生字符串函数常常会"数错字、切坏字"。Patchwork UTF-8为 PHP 提供了一套完整、可移植、高性能的UTF-8 / Unicode / 图形簇(Grapheme Clusters)处理函数库,一个Patchwork\Utf8类就镜像了 50+ 个原生字符串函数,再配合土耳其语专用类、启动引导类和 mbstring/iconv/intl 兼容层,累计提供 60 多个图形簇感知函数。本文将这份 API 清单按使用场景分组一次讲透,并附上速查表,方便你快速检索。

为什么 PHP 原生字符串函数"不认识"中文?

PHP 内置的字符串函数把字符串当作字节来处理。而一个汉字在 UTF-8 里占 3 个字节,emoji 占 4 个字节,"中🇨🇳"这种组合字符更是由多个码点拼成一个可见字(即"图形簇")。直接调用substr('中文', 0, 1)会得到乱码。

Patchwork UTF-8 的核心思路是:用与原生命名完全一致的函数,但内部按图形簇计算。你几乎不需要学习新 API——把strlen换成Utf8::strlen即可,参数和行为与原生函数一一对应。

30 秒上手:Bootup 引导与请求过滤

安装(composer 环境)后,只需在应用启动早期调用引导类,即可开启兼容层并配置好 UTF-8 环境,源码位于src/Patchwork/Utf8/Bootup.php

  • Bootup::initAll()—— 一键启用 mbstring / iconv / intl 纯 PHP 兼容层,并配置 PHP 为 UTF-8;
  • Bootup::filterRequestUri()—— URL 非 UTF-8 时自动重定向到 UTF-8 编码版本;
  • Bootup::filterRequestInputs()—— 将 HTTP 输入统一规范化为 UTF-8 NFC。

这三步做完,后续的 60+ 个函数即可安全使用。

60+ 函数速查表:按场景分组

以下函数均位于src/Patchwork/Utf8.php中的Patchwork\Utf8类,全部为静态方法,直接Utf8::函数名()调用即可。

1️⃣ 环境搭建与字符串体检(4 个)

函数作用(长尾场景)
isUtf8()判断字符串是否为合法 UTF-8 编码,入库前防乱码必备
filter()规范化为 UTF-8 NFC,可自动从 CP-1252 转换
toAscii()将 UTF-8 转写为纯 ASCII(如 "café" → "cafe")
wrapPath()Windows 及其他系统下的 Unicode 文件路径访问封装

2️⃣ 无差别匹配与终端显示(3 个)

函数作用
strtocasefold()Unicode 大小写折叠,用于"无视大小写"的精确比对
strtonatfold()大小写敏感的自然排序比对转换
strwidth()计算字符串在终端打印时的显示宽度(中文算 2 格)

3️⃣ 输入与编解码(5 个)

函数作用
filter_input()按图形簇感知的filter_input镜像版
filter_input_array()批量过滤 HTTP 输入数组
json_decode()自动处理带 BOM 或编码异常的 JSON 字符串
utf8_encode()/utf8_decode()UTF-8 与 CP-1252 双向转换(原生函数已废弃,这是替代方案)

4️⃣ 长度、定位与截取(12 个,最常用)

函数对应原生一句话说明
strlen()strlen按"可见字符"数长度,中文 emoji 不再数错
strpos()/stripos()strpos查找子串位置,不区分大小写版自动做 Unicode 折叠
strrpos()/strripos()strrpos从末尾查找子串位置
strstr()/stristr()strstr返回命中位置及其后的全部内容
strrchr()/strrichr()strrchr返回最后一次命中及其后内容
substr()substr安全截取 UTF-8 子串,绝不切出半个汉字

5️⃣ 修剪、替换与重组(13 个)

函数对应原生一句话说明
ltrim()/rtrim()/trim()同名按图形簇修剪首尾空白或指定字符
substr_compare()substr_compare比较两个字符串的部分片段
substr_count()substr_count统计子串出现次数
substr_replace()substr_replace在任意位置替换片段
str_split()str_split按字符数安全拆分,不会劈开多字节字符
strcspn()/strspn()同名计算不在/在字符集中的连续长度
strpbrk()strpbrk返回字符集中首个出现的字符位置
strtr()strtr批量字符映射替换
str_shuffle()str_shuffle按图形簇打乱(emoji 组合不会被拆散)
strrev()strrev安全反转字符串
str_pad()str_pad按显示宽度补白,中文对齐不再错位
wordwrap()wordwrap按图形簇宽度自动折行
str_word_count()str_word_count统计单词数

6️⃣ 大小写与字符级操作(7 个)

函数对应原生一句话说明
strtolower()/strtoupper()同名基于 Unicode 的大小写转换(含多字符转换,如德语 ß → SS)
ucfirst()/lcfirst()同名首字符转大写/小写
ucwords()ucwords每个单词首字母大写
str_ireplace()str_ireplace不区分大小写的 Unicode 替换
chr()chr码点转 UTF-8 字符
ord()ordUTF-8 字符转码点
count_chars()count_chars按码点统计字符分布

7️⃣ 比较与格式化(8 个)

函数对应原生一句话说明
strcmp()/strnatcmp()同名字节序比较 / 自然排序比较
strcasecmp()/strnatcasecmp()同名忽略大小写的两种比较
strncmp()/strncasecmp()同名限定长度的比较
number_format()number_format数字本地化格式化(图形簇感知分隔符)

💡 小技巧:几乎所有函数名都能与 PHP 原生函数"对号入座",迁移老代码时只需把全局函数名加一个Utf8::前缀即可。

土耳其语大小写的专门方案:TurkishUtf8

普通strtolower('I')会得到i,但在土耳其语中İ的小写是ı(无点 i),这是国际开发中最经典的"坑"。Patchwork\TurkishUtf8(源码位于src/Patchwork/TurkishUtf8.php)完整克隆了Patchwork\Utf8的全部功能,并重写了strtolowerstrtoupperucfirstucwordsstr_ireplacestripos等 10 个大小写相关函数以适配土耳其语规则。做国际化产品时,建议根据用户区域动态二选一。

兼容层:mbstring / iconv / intl 没装也不怕

除了 60+ 个类方法,本库还内置纯 PHP 实现的"移植层",当服务器缺少扩展时自动兜底,源码在src/Patchwork/PHP/Shim/目录:

  • mbstringmb_strlenmb_substrmb_strposmb_convert_encoding等 30+ 个函数(见src/Patchwork/PHP/Shim/Mbstring.php);
  • iconviconviconv_strleniconv_mime_decode等(见src/Patchwork/PHP/Shim/Iconv.php);
  • intlNormalizer规范化类与grapheme_*函数族(见src/Patchwork/PHP/Shim/Intl.php,顶层入口为src/Normalizer.php);
  • utf8_encode / utf8_decode:PHP 8.2 起原生函数被废弃,这里提供永久替代。

这意味着你的应用即使在"裸 PHP"服务器上也能正确跑中文。

核心文件路径索引

  • 主函数库:src/Patchwork/Utf8.php
  • 土耳其语扩展:src/Patchwork/TurkishUtf8.php
  • 启动引导:src/Patchwork/Utf8/Bootup.php
  • 兼容性层:src/Patchwork/PHP/Shim/
  • 最佳拟合转换表(UTF-8 → 代码页):src/Patchwork/Utf8/data/
  • 测试用例(可当文档读):tests/Utf8/tests/PHP/Shim/
  • 打包配置:composer.json(包名patchwork/utf8,Apache-2.0 / GPL-2.0 双许可)

常见问题(FAQ)

Q1:必须安装 mbstring 或 intl 扩展吗?不需要。只要pcre带 Unicode 支持(绝大多数环境默认满足),本库纯 PHP 实现即可完整工作。

Q2:strlenmb_strlen我该用哪个?推荐统一走Utf8::strlen风格。它优先复用原生扩展(有扩展时性能最佳),无扩展时自动降级,行为在所有服务器上一致。

Q3:图形簇(Grapheme Cluster)到底是什么?它是"用户眼中看到一个字符"的最小单元,例如 emoji 国旗 🇨🇳 由两个区域指示符组成、"e + 组合重音" 也是两个码点。本库全部函数都按图形簇而非字节/码点计算,这正是它区别于普通多字节处理的关键。

Q4:如何验证我的环境配置正确?先跑Bootup::initAll(),再用Utf8::isUtf8()抽查一段来自外部的字符串,最后用Utf8::strlen('中文测试')应得到 4 而不是 12 字节。

小结

Patchwork UTF-8 的价值一句话概括:一套与原生命名零差异、图形簇感知、不挑服务器环境的 PHP 字符串函数库。上文速查表覆盖 55 个核心镜像函数 + Bootup 引导 3 个 + 土耳其语重写 10 个 + 兼容层 30+ 个函数,总计 60 余个。建议收藏本文,遇到"中文被切坏、emoji 数错、大小写不灵"时,直接按分组查表即可。

【免费下载链接】utf8Portable and performant UTF-8, Unicode and Grapheme Clusters for PHP项目地址: https://gitcode.com/gh_mirrors/ut/utf8

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询