PHP 字符串函数:哪些适用于 UTF-8?

PHP string functions: which ones will work with UTF-8?

PHP documentation 中列出了在字节级别上工作的字符串函数。这适用于 SBCS 字符串,但不适用于 MBCS 字符串。幸运的是,一种著名的编码 UTF-8 向后兼容高达 7 位 US-ASCII。

从 PHP 5.6 开始,默认编码已更改为 UTF-8,但它的字符串函数还没有。众所周知的替代方案是 iconv, Multibyte String and Intl。如果以正确的方式编译,PCRE 函数也可以与 MBCS 兼容。

当 SBCS 年龄代码需要转换为 VMBCS (UTF-8) 合规性时,需要重写标准 PHP 字节字符串函数以确保 MBCS 安全。虽然最基本的函数(如 strpos())有一个 mb_* 变体(如 mb_strpos()),但大多数 PHP 的字符串函数没有 mb_ 对应物。为了继续使用,必须重写它们。

在第一阶段,需要确定哪些 SBCS 字符串函数可以工作,尽管它们具有面向字节的特性。有些已经在 SO 上被识别出来,我现在正在寻找的是一个完整的函数列表,这些函数可以与 UTF-8 一起使用,或者在谨慎使用时使用,例如仅使用 US-ASCII 的参数。澄清一下,问题不在于像 chr()crc32() 这样的字节字符串函数,而是关于获取像这样的函数列表:

有人知道这样的列表吗?

PHP standard string functions 无法正确处理多字节字符串。它们将参数作为单字节字符串处理,无论您传递给它们的字符串是什么类型。它们不对字符进行操作,而是对字节进行操作。

PHP 不保留每个字符串的编码。它以相同的方式处理所有这些。

PHP multi-byte string functions provided by the mbstring PHP extension 可以处理多种字符编码,在编码之间进行转换并自动检测给定字符串的编码。它们对字符进行操作,并且能够处理固定长度编码(UTF-16,f.e。)和可变长度编码(UTF-8)。

核心 PHP SBCS 字符串函数

假设 default encoding of PHP is set to UTF-8这些字符串函数可以工作:

不幸的是,所有其他字符串函数对 UTF-8 不起作用。 障碍:

  • 大小写处理或空格不适用于 UTF-8
  • 参数中的字符串长度和 return 值不在字符长度中
  • 字符串处理导致数据损坏
  • 字符串函数完全面向 ASCII

在某些情况下,当参数为 US-ASCII 且 长度是字节长度。

二进制字符串函数仍然有用:

  • bin2hex将二进制数据转换为十六进制表示
  • chrReturn一个特定的字符(=byte)
  • convert_uudecode 解码 uuencoded 字符串
  • convert_uuencode 对字符串进行编码
  • crc32计算字符串的crc32多项式
  • crypt 单向字符串散列
  • hex2bin 解码十六进制编码的二进制字符串
  • md5_file 计算给定文件的 md5 散列
  • md5计算字符串的md5散列
  • ord Return 字符的 ASCII 值(=byte)
  • sha1_file计算文件的sha1散列值
  • sha1计算字符串的sha1散列

配置函数不适用:

Regular expression functions编码转码功能暂不考虑

扩展

在很多情况下,Multibyte String 提供 UTF-8 变体:

  • mb_convert_case 对字符串执行大小写折叠
  • mb_parse_str解析GET/POST/COOKIE数据并设置全局变量
  • mb_split 使用正则表达式拆分多字节字符串
  • mb_strcut 获取字符串的一部分
  • mb_strimwidth 获取指定宽度的截断字符串
  • mb_stripos 查找字符串在另一个字符串中首次出现的位置,不区分大小写
  • mb_stristr 查找字符串在另一个字符串中的第一次出现,不区分大小写
  • mb_strlen 获取字符串长度
  • mb_strpos 查找字符串在字符串中第一次出现的位置
  • mb_strrchr 查找一个字符在另一个字符串中的最后一次出现
  • mb_strrichr 查找一个字符在另一个字符串中的最后一次出现,不区分大小写
  • mb_strripos 查找字符串在另一个字符串中最后一次出现的位置,不区分大小写
  • mb_strrpos 查找字符串在字符串中最后一次出现的位置
  • mb_strstr 查找字符串在另一个字符串中的第一次出现
  • mb_strtolower 使字符串小写
  • mb_strtoupper 使字符串大写
  • mb_strwidth Return 字符串宽度
  • mb_substr_count统计子串出现的次数
  • mb_substr 获取字符串的一部分

iconv提供了最少的字符串函数:

最后Intl has a lot of extra and powerful Unicode features (but no regular expressions) as part of i18n。一些功能与其他字符串函数重叠。关于字符串函数,这些是: