2009-11-08 19 views
2

我的PHP配置为mbstring.func_overload = 7,所以所有的单字节字符串函数都被映射为它们的多字节等价物。但我仍然有时需要将字符串视为字节数组;例如,在计算其大小或进行加密时。使用PHP的mbstring.func_overload查找字符串中的字节

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

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

编辑:我希望通过自己修改原有的功能mb_orig_X,如mb_orig_strlen PHP的来源时发现。可能不安全,因为它们没有记录,但很有趣。

回答

1

我认为如果你需要使用原始的函数(即,如果你确实需要使用二进制字符串),你不应该重写这些函数,这是一个相当脏的解决方案。这迫使你为你之前做出的选择做出更加肮脏的解决方法。它可能会破坏你使用的库,但你并没有意识到这一点(但PHP团队不断发明更多和更愚蠢的功能)。

但是如果你必须保持这种状态,你应该:

  1. 使用中性语言encodingASCII(不解释,但对于那些阅读你的代码 - 即使这是你的2年。)和
  2. 文件为什么你做了彻底的,因为这将是每个人都看到这段代码非常困惑。
+1

我不认为这是一个肮脏的解决方案。有时你只需要处理二进制数据。但我同意你必须小心它(见http://stackoverflow.com/questions/1647419/php-mbstring-funcoverload-vs-using-mbstring-functions)。另外,使用编码名称的更好选择是“二进制”或“8位”。 – mercator 2009-11-08 17:47:08

+0

重写记录良好的函数的行为总是*一个坏主意。可以这样想:函数对你来说是“说谎”,即它没有做,它承诺做什么。或者这里是另一个:如果你的数组会停止存储NULL值,如果在数组中甚至没有生成密钥,会默默地忽略它们会发生什么?所有的配置值都是'array.store_null_values = false'(我希望PHP团队没有人阅读这个,我可能会给他们不好的想法。) – soulmerge 2009-11-08 18:04:12

+0

'binary'是一个真正的编码吗?我没有看到它在http://php.net/manual/en/mbstring.supported-encodings.php上列出,但它似乎工作。你知道'binary','8bit'和'ascii'之间的区别吗? – 2009-11-08 20:50:49