【问题标题】:How to compile a MO hash table?如何编译 MO 哈希表?
【发布时间】:2014-01-22 05:13:07
【问题描述】:

我一直在使用 PHP 中的 Gettext MO 文件哈希表。虽然我不确定这个可选表有多重要,但我想确保在生成 MO 文件时尽可能实现完整规范。

我在我的 Mac 和 Linux 上使用 Gettext msgfmt 编译了一个包含条目 "","a","b","c" 的简单 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”示例的正确哈希表是什么?

【问题讨论】:

    标签: php localization hashtable gettext mo


    【解决方案1】:

    我已经解决了这个问题。

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

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

    我的示例代码现在可以工作了。我生成的表与从 MO 文件中提取的匹配。

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2023-03-31
      • 2017-01-01
      相关资源
      最近更新 更多