我一直在使用PHP中的Gettext MO文件哈希表。虽然我不确定这个可选表有多重要,但我想确保在生成MO文件时尽可能实现完整的规范。
我在Mac和Linux上使用Gettext "","a","b","c"
编译了一个包含条目msgfmt
的简单PO文件。哈希表长5个字节,但奇怪地包含很大的空字节,如下所示:01 00 00 00 00
运行从Gettext源代码中提取的算法我改为生成表01 00 02 03 04
。
这是我的测试代码:
https://gist.github.com/timwhitlock/8255619 (包括示例PO文件)
我不写C,但是通过GNU Gettext源代码混淆我的方式来移植显示的函数。
我自己的哈希表编译可能是错误的,但要理解为什么我想首先理解为什么msgfmt生成的MO文件有一个哈希表大多是零?
我很确定我正在正确地从MO文件中提取哈希表。我从第六个字节得到表格的大小和位置outlined in the spec。
在我的'abc'示例中,没有使用双重哈希,所以我不明白该表是如何正确的,无论我的表是否正确。
这个'abc'示例的正确哈希表是什么?
答案 0 :(得分:1)
我已经解决了这个问题。
我愚蠢地使用单个字节来保存哈希表中的每个整数。这是因为在C中看到hash_tab[idx]
之类的东西,我的PHP大脑将其转换为$hash_tab{$idx}
,这当然是错误的。它将是substr($hash_tab,$idx,$idx+4)
我也没有看到哈希表“size”是字符串数而不是字节长度。
我的示例代码现在有效。我生成的表与从MO文件中提取的表匹配。