如何编译MO哈希表?

时间:2014-01-04 14:28:08

标签: php localization hashtable gettext mo

我一直在使用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'示例的正确哈希表是什么?

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。

我愚蠢地使用单个字节来保存哈希表中的每个整数。这是因为在C中看到hash_tab[idx]之类的东西,我的PHP大脑将其转换为$hash_tab{$idx},这当然是错误的。它将是substr($hash_tab,$idx,$idx+4)

我也没有看到哈希表“size”是字符串数而不是字节长度。

我的示例代码现在有效。我生成的表与从MO文件中提取的表匹配。