将两个字符串转换为相同的字节长度

时间:2009-10-28 11:10:29

标签: php unicode utf-8

我的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);
            }
        }
    }
}

使用以下内容:

[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)

2 个答案:

答案 0 :(得分: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)

假设ASCII,而不是阅读c,如果源文件编码为UTF-16,则parse_ini_file()将读取\0c\0

如果您可以控制INI文件的格式,请确保使用您喜欢的文本编辑器将其保存为UTF8或ISO-8859-1编码。

否则,您必须使用file_get_contents()读取文件内容,进行编码转换(例如使用iconv())并将结果传递给parse_ini_string()。这里的缺点是您必须检测或硬编码原始文件编码。

如果您的PHP安装上有mb多字节扩展程序,则可以使用mb_detect_encoding()mb_convert_encoding()动态进行转换。

答案 1 :(得分:0)

试试这个:

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