Gor*_*onM 6 php string multibyte
我正在越来越多地确保 PHP 应用程序是多字节安全的,这主要涉及用其等效的 mb_* 函数替换字符串操作函数。
然而,字符串连接让我停下来思考。
某些字符编码(例如 UTF-16 unicode)可以在开头包含字节顺序标记。如果您连接了两个 UTF16 字符串,则可能会将 BOM 引入到结果字符串的开头位置以外的位置。我怀疑还有其他编码也可以包含“标题”信息,这样将两个相同编码的字符串拼接在一起也会有问题。在进行多字节字符串连接时,PHP 是否足够聪明以丢弃 BOM 等?我怀疑不是因为 PHP 传统上只将字符串视为字节序列。是否有一个多字节安全等价于连接?我在 mbstring 文档中找不到任何内容。
显然,连接不同编码的字符串永远不会安全,所以我现在不担心。
PHP 传统上仅将字符串视为字节序列
现在仍然如此。PHP 没有字符串的概念,就像其他语言中存在的那样。因此,所有字符串始终都是字节字符串,您需要手动跟踪其中哪些是二进制字符串,哪些是字符串以及正在使用哪种编码。将 Unicode 字符串引入 PHP 的努力产生了PHP 6,但它被放弃并且从未发布。但话又说回来,即使是具有本机字符串的语言也不会自动执行您所要求的操作。
查看有关 BOM 的 Unicode FAQ,下面的一些信息直接来自那里。
如果字节顺序标记最终出现在字符串的中间,则 Unicode 规定应将其解释为零宽度非中断空格。我的结论是,这通常不会成为问题,因此忽略 BOM 并没有那么可怕。
但是,如果这让您感到困扰,我的建议如下:
UTF-16BE或UTF-16LE使用标头。Normalizer。使用您最喜欢的框架的功能(如果有)。mb_internal_encoding()设置所有功能的默认值mb_*()。也就是说,请注意,连接多字节字符串可能会导致多种意外情况,字符串中间的 BOM 只是其中之一。使用双向文本时也可能会出现问题,其中连接的第一个字符串中的 RTL 或 LTR 代码点可能会影响第二个字符串中的文本。此外,在使用其他字符串操作时也可能会出现许多问题,例如mb_substr()在双向文本上使用也可能会产生意外的结果。涉及组合变音符号的文本也可能存在问题。
| 归档时间: |
|
| 查看次数: |
401 次 |
| 最近记录: |