2012-10-05 66 views
5

我有以下代碼:爲什麼PHP 5.4中的mb_convert_case會破壞我的字符串,而在5.2版本中呢?

header('Content-type: text/html; charset=utf-8'); 
$str = 'áá áá'; 
echo $str."\n"; 
echo mb_convert_case($str, MB_CASE_TITLE)."\n"; 
echo bin2hex($str)."\n"; 
echo bin2hex(mb_convert_case($str, MB_CASE_TITLE))."\n"; 

使用PHP 5.2.2,我得到下面的輸出:

áá áá 
áá áá 
c3a1c3a120c3a1c3a1 
c3a1c3a120c3a1c3a1 

使用PHP 5.4.3,我得到這個:

áá áá 
á� á� 
c3a1c3a120c3a1c3a1 
c3a1e3a120c3a1e3a1 

我在這兩種情況下的預期產量將是:

áá áá 
Áá Áá 
c3a1c3a120c3a1c3a1 
c381c3a120c381c3a1 

所以我有兩個問題:

  1. 爲什麼沒有一個正在轉換爲?
  2. 爲什麼PHP 5.4會破壞我的字符串?
+4

不能專門回答你的問題,但也可以嘗試明確地將'$ encoding'參數傳遞給'mb_convert_case'。 – deceze

+0

我建議以及@deceze評論。添加顯式編碼參數。還要檢查您的默認編碼爲mb字符串。哪個編碼是文件? – hakre

回答

6

無論是在$encoding傳遞給每個調用mb_功能,或設置:

mb_internal_encoding("UTF-8"); 

,以確保PHP知道你正在使用什麼編碼。否則,編碼來自php.ini,或者如果沒有包括在內,則使用默認的ISO-8859-1。

因此,您的5.4安裝默認爲ISO-8859-1,因此降低UTF-8序列的首位字節,將其打破。在5.2中我也遇到過同樣的情況,所以也許有關於5.2安裝的其他內容有所不同 - ini中的internal_encoding被設置爲其他字節位置中沒有字母的其他內容?

+0

啊,當然,我設置了HTTP編碼頭,但我的internal_encoding沒有設置!根據PHP 5.2的phpinfo(),我的mbstring.internal_encoding設置爲ISO-8859-1,而在我的PHP 5.4配置中,它根本沒有設置(「無值」)。有趣的是,按照您的建議,5.4似乎默認爲ISO-8859-1(沒有參數的調用mb_internal_encoding()證實了這一點),但是兩個版本之間的輸出不同。無論如何,明確地將mbstring.internal_encoding設置爲UTF-8可以解決兩個版本中的問題。謝謝你的幫助! – Alex

相關問題