2009-11-08 44 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