【发布时间】:2017-11-15 04:56:03
【问题描述】:
PHP documentation 中列出了在字节级别上工作的字符串函数。这适用于 SBCS 字符串,但不适用于 MBCS 字符串。幸运的是,一种著名的 UTF-8 编码向后兼容最高 7 位 US-ASCII。
自 PHP 5.6 起,默认编码已更改为 UTF-8,但它的字符串函数没有。众所周知的替代方案是iconv、Multibyte String 和Intl。如果以正确的方式编译,PCRE 函数也可以兼容 MBCS。
当需要将 SBCS 年龄代码转换为符合 VMBCS (UTF-8) 标准时,需要重写标准 PHP 字节字符串函数以保证 MBCS 安全。虽然最基本的函数(如strpos())有一个mb_* 变体(如mb_strpos()),但大多数PHP 的字符串函数没有mb_ 对应物。为了继续使用,它们必须被重写。
在第一阶段,需要确定哪些 SBCS 字符串函数可以工作,尽管它们是面向字节的。有些已经在 SO 上被识别出来,我现在正在寻找的是一个完整的函数列表,这些函数可以与 UTF-8 一起使用,或者在谨慎使用时,例如仅使用 US-ASCII 的参数。澄清一下,问题不在于chr() 或crc32() 之类的字节字符串函数,而在于获取如下函数列表:
- 不安全:
count_chars()计算字节数,... - 注意:只要参数是 US-ASCII,
ltrim()就可以工作,... - 安全:
str_repeat()可用于 MBCS 字符串,...
有人知道这样的清单吗?
【问题讨论】:
-
你在文档中搜索过the list of PHP string functions吗?
-
是的,我只需要一个列表就可以知道要重写哪些函数。
-
提供一个东西列表不适合 SO,但它在 PHP 中的问题已经足够了,这是一个合理的问题。不幸的是,最可行的事情是真正了解 UTF-8 以及每个单独的字符串函数的作用,从中您可以判断自己所做的事情是否安全。是的,我知道这不是一个非常令人满意的答案……
-
@deceze 我已经看到很多关于函数 X 是否是多字节安全的问题。虽然这些问题确实合适,但我同意不合适的说法。我考虑过 SO 文档,但我读过他们将改变结构。
标签: php string multibyte-functions