2

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

自 PHP 5.6 起,默认编码已更改为 UTF-8,但它的字符串函数没有。众所周知的替代品是iconvMultibyte StringIntl。当以正确的方式编译时,PCRE 函数也可以兼容 MBCS。

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

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

  • 不安全:count_chars()计算字节数,...
  • 注意:ltrim()只要参数是 US-ASCII 就可以工作,...
  • 安全:str_repeat()将与 MBCS 字符串一起使用,...

有人知道这样的清单吗?

4

2 回答 2

1

核心 PHP SBCS 字符串函数

假设PHP 的默认编码设置为 UTF-8这些字符串函数将起作用

不幸的是,所有其他字符串函数都不适用于 UTF-8。障碍:

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

在某些情况下,当参数为 US-ASCII 且长度为字节长度时,函数可以按预期工作。

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

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

配置功能不适用

不考虑正则表达式函数和编码和转码函数。

扩展

在很多情况下,多字节字符串 提供了 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返回字符串的宽度
  • mb_substr_count计算子字符串出现的次数
  • mb_substr获取字符串的一部分

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

最后,作为i18n的一部分, Intl具有许多额外且强大的 Unicode 功能(但没有正则表达式)。某些功能与其他字符串函数重叠。关于字符串函数,它们是:

于 2017-06-15T08:51:52.270 回答
1

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

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

PHP 扩展提供的PHP 多字节字符串函数可以处理多种字符编码,在编码之间进行转换,并自动检测给定字符串的编码。它们对字符进行操作,并且能够处理固定长度编码(UTF-16、fe)和可变长度编码(UTF-8)。mbstring

于 2017-06-13T12:49:51.113 回答