2009-10-28 151 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