【问题标题】:Gettext not detecting utf8 properly in PHPGettext 在 PHP 中未正确检测到 utf8
【发布时间】:2011-11-02 16:41:05
【问题描述】:

我有一个使用 Gettext 作为 i18n 引擎的 PHP 应用程序。翻译工作正常,唯一的问题是我遇到了 UTF8 字符的编码问题。我加载 gettext 的 PHP 代码是这样的:

bindtextdomain( $domain, PATH_BASE . DS . "language" . DS );
$this->utf8Encode = strtolower($encoding) == "utf-8";
bind_textdomain_codeset($domain, $encoding);

textdomain($domain);

我的模板使用 utf8 字符集呈现页面,并且我尝试了几乎任何方法来加载正确的字符集。对于我正在加载 SL_sl 的当前语言环境,名称显示正确,但 UTF8 字符存在问题,因此它应该出现在 Država 的位置,它显示为 Dr?ava

【问题讨论】:

    标签: php internationalization gettext


    【解决方案1】:

    原来如此,以前也出现过,现在又出现了,我自己找到了解决办法!问题是,就像我对@bozdoz 说的那样,我已经在转换 UTF8 文本,但我没有意识到 gettext 函数返回了一个 UTF8 字符串,所以如果你这样做:

    $encoded = utf8_encode($utf8String);
    

    那么当$utf8String 是一个实际的UTF8 字符串时,您将遇到一个非常讨厌的错误。因此,我对代码进行了一些修改,翻译方法(简化)最终如下:

    $translation = gettext($singular);
    $encoded = $this->utf8Encode ? $this->Utf8Encode($translation) : $translation;
    

    Utf8Encode方法是这样的:

    private function Utf8Encode( $text )
    {
        if ( mb_check_encoding($text, "utf8") == TRUE ){
            return $text;
    
        return utf8_encode($text);
    }
    

    我希望如果有人遇到同样的错误,这可以提供帮助!

    【讨论】:

      【解决方案2】:

      从部分信息中,我建议您查看实际的 mo/po 文件,在 poedit 中有几个关于 utf8 编码的警告。假设其他一切都是正确的(元数据、标题等),这是唯一需要检查的事情

      【讨论】:

      • 问题不在于 mo/po 文件,因为我检查了它们的编码并且没有问题。
      【解决方案3】:

      尝试使用 utf8_encode() 对其进行编码。我无法从您的代码中真正看出,但也许可以这样实现:

      utf8_encode($domain);
      

      【讨论】:

      • 不,我试过那个,除了我的整个项目在输出和输入之前检查 UTF8 字符串。不管怎么说,还是要谢谢你。 btw $domain 只是用于翻译的域名
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2021-04-08
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多