2009-10-28 152 views
1

我的PHP代碼中有2個字符串,1是我的方法的參數,1是來自ini文件的字符串。 問題在於它們並不相同,儘管它們具有相同的內容,可能是由於編碼問題。當使用var_dump時,據報道第一個字符串的長度爲23,第二個字符串的長度爲47(請參閱我的問題的結尾部分)。並且最終具有相同的長度,所以比較不會失敗?最好,我希望他們是utf8編碼。將兩個字符串轉換爲相同的字節長度

作爲參考,這是從代碼的摘錄:

static function getString($keyword,$file) { 

$lang_handle = parse_ini_file($file, true); 

var_dump($keyword); 
    foreach ($lang_handle as $key => $value) { 
     var_dump($key); 
     if ($key == $keyword) { 
      foreach ($value as $subkey => $subvalue) { 
       var_dump("\t" . $subkey . " => " . $subvalue); 
      } 
     } 
    } 
} 

具有以下的ini:

[clientcockpit/login.php] 
header = "Kunden Login" 
username = "Benutzername" 
password = "Passwort" 
forgot = "Passwort vergessen" 
login = "Login" 

當調用用的getString( 「clientcockpit/login.php中」 的方法中,「 inifile.ini「)的輸出是:

string 'clientcockpit/login.php' (length=23) 
string '�c�l�i�e�n�t�c�o�c�k�p�i�t�/�l�o�g�i�n�.�p�h�p�' (length=47) 
+0

有問題的字符串是來自用戶還是ini文件? – 2009-10-28 11:13:21

+0

如果我記得parse_ini_file()函數有一個utf8編碼(多字節)的錯誤。您可能需要更改.ini文件的編碼。 (我不能谷歌參考這個信息) – Ismael 2009-10-28 11:16:24

+0

谷歌它:php multibyte parse_ini_file 我想你會發現這個問題的線索。不幸的是我不確定。 – Ismael 2009-10-28 11:18:47

回答

3

您的INI文件似乎是UTF16編碼或類似的,使用兩個字節來表示單個字符。我想你的字符串中的奇怪字符實際上是NULL字節(\0)。

PHP的Unicode支持很差,我猜parse_ini_file()不支持正確的多字節編碼。它會將文件視爲使用「ASCII兼容」單字節編碼進行編碼,只需查找特殊字符[]即可檢測節。其結果,該部分的鍵將被破壞:實際上屬於[]一個字節將是部分鍵的一部分:

 
UTF-16: [c] (3 characters, 6 bytes) 

For UTF-16BE (big endian): 

    Bytes: 00 5B 00 63 00 5D (6 bytes) 
    ASCII: \0 [ \0 c \0 ] (6 characters) 

For UTF-16LE (little endian): 

    Bytes: 5B 00 63 00 5D 00 (6 bytes) 
    ASCII: [ \0 c \0 ] \0 (6 characters) 

假設而不是讀取c ASCII,parse_ini_file()將如果源文件中讀出\0c\0編碼是UTF-16。

如果您可以控制INI文件的格式,請務必使用您最喜愛的文本編輯器將其保存爲UTF8或ISO-8859-1編碼。

否則,您將不得不使用file_get_contents()讀取文件內容,進行編碼轉換(例如使用iconv())並將結果傳遞給parse_ini_string()。這裏的缺點是你將不得不檢測或硬編碼原始文件編碼。

如果您的PHP安裝中提供了mb多字節擴展,您可以使用mb_detect_encoding()mb_convert_encoding()動態地進行轉換。

+0

確保文件保存爲UTF-8而不是UTF-16(客戶端提供該文件),它似乎工作正常。但是,我無法使用mbstrings將字符串編程轉換爲其他編碼。 – Pascal 2009-10-28 12:38:56

0

試試這個:

$lang_handle = parse_ini_string(file_get_contents($file), true); 
+0

這隻適用於PHP> 5.3,並且我使用5.2.6 – Pascal 2009-10-28 12:14:11