使用PHP'查找字符串中的字节;s mbstring.func_重载打开

使用PHP'查找字符串中的字节;s mbstring.func_重载打开,php,character-encoding,multibyte,Php,Character Encoding,Multibyte,我在PHP中配置了mbstring.func_重载=7,因此所有单字节字符串函数都映射到它们的多字节等效函数。但有时我仍然需要将字符串视为字节数组;例如,在计算其大小或进行加密时 这里最好的方法是什么?我是否可以只使用多字节函数并将单字节编码传递给它们,即使字符串实际上不是这样编码的?例如: mb_substr($utf8str, 0, 1, "latin1"); mb_strlen($utf8str, "latin1"); 编辑:我在查看PHP源代码时注意到,它们将原始函数重命名为mb_or

我在PHP中配置了
mbstring.func_重载=7
,因此所有单字节字符串函数都映射到它们的多字节等效函数。但有时我仍然需要将字符串视为字节数组;例如,在计算其大小或进行加密时

这里最好的方法是什么?我是否可以只使用多字节函数并将单字节编码传递给它们,即使字符串实际上不是这样编码的?例如:

mb_substr($utf8str, 0, 1, "latin1");
mb_strlen($utf8str, "latin1");

编辑:我在查看PHP源代码时注意到,它们将原始函数重命名为mb_orig_X,就像mb_orig_strlen一样。可能使用起来不安全,因为它们没有文档记录,但很有趣。

我认为如果需要使用原始函数(即,如果确实需要对二进制字符串进行操作),就不应该重写这些函数,这是一个相当肮脏的解决方案。这迫使你为之前的选择做一个更脏的变通。它可能会破坏您正在使用的库,而您却没有意识到这一点(但PHP团队不断发明越来越多的愚蠢特性)

但如果你必须这样做,你应该:

  • 使用与语言无关的语言,如
    ASCII
    (不是为口译员,而是为那些阅读你的代码的人——即使那是你在2年内)和
  • 请详细记录为什么要这样做,因为这会让每个人都很困惑

  • 我不认为这是一个肮脏的解决方案。有时您只需要处理二进制数据。但我同意你必须小心(见)。此外,使用编码名称的更好选择是
    binary
    8bit
    。重写一个有良好文档记录的函数的行为总是一个坏主意。这样想:函数在欺骗你,即它不做它承诺做的事情。或者这里还有另一个问题:如果数组停止存储空值,甚至不在数组中生成键而默默忽略它们,会发生什么?全部由配置值
    array.store\u null\u values=false
    (我希望PHP团队中没有人读到这篇文章,我可能给了他们一些不好的想法。)
    binary
    是真正的编码吗?我没有看到它列在上面,但它似乎有效。您知道
    binary
    8bit
    ascii
    之间的区别吗?查看了源代码<代码>二进制和
    8位
    似乎是相同的<代码>7bit当然只包括7位字符,
    ascii
    包括0x20-0x80,加上0、0x09、0x0a和0x0d。
    binary
    8bit
    ()的别名。正如soulmerge所说,除了可读性之外,所有这些差异对任何情况下获取字符串长度都不重要。