【问题标题】:Convert two string to the same byte length将两个字符串转换为相同的字节长度
【发布时间】:2009-10-28 11:10:28
【问题描述】:

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

【问题讨论】:

  • 问题字符串是来自用户还是来自ini文件?
  • 如果我记得 parse_ini_file() 函数有一个 utf8 编码(多字节)的错误。您可能需要更改 .ini 文件的编码。 (我无法通过谷歌搜索参考资料)
  • google it: php multibyte parse_ini_file 我想你会找到解决这个问题的线索。不幸的是,我不确定。
  • @C.罗斯有问题的字符串来自ini文件@Ismael我找不到parse_ini_file和php 5.2.6(我使用的)有任何问题,你有链接吗?也许是 parse_ini_file 的替代品?
  • @Pascal 不幸的是,我不知道任何替代方案。我仍然相信问题只是一些编码。使用相同的编码保存 .ini 文件和 .php 脚本(调用函数 parse_ini_file)。如果它不起作用,我不知道可能是什么问题。

标签: php unicode utf-8


【解决方案1】:

您的 INI 文件似乎采用 UTF16 编码或类似编码,使用两个字节表示单个字符。我猜你字符串中的奇怪字符实际上是 NULL 字节(\0)。

PHP 的 Unicode 支持很差,我猜parse_ini_file() 不能正确支持多字节编码。它将文件视为使用“ASCII 兼容”单字节编码进行编码,只是寻找特殊字符 [] 来检测部分。结果,节键将被损坏:实际上属于 [] 的一个字节将成为节键的一部分:

UTF-16:[c](3 个字符,6 个字节) 对于 UTF-16BE(大端): 字节:00 5B 00 63 00 5D(6 字节) ASCII:\0 [ \0 c \0 ](6 个字符) 对于 UTF-16LE(小端序): 字节:5B 00 63 00 5D 00(6 字节) ASCII:[ \0 c \0 ] \0(6 个字符)

假设使用 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() 进行动态转换。

【讨论】:

  • 确保文件保存为 UTF-8 而不是 UTF-16(客户端提供它),它似乎工作。但是,我无法使用 mbstrings 以编程方式将字符串转换为其他编码。
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多