【问题标题】:Codeigniter 4 localization issue with UTF-8 charactersUTF-8 字符的 Codeigniter 4 本地化问题
【发布时间】:2021-12-31 18:05:05
【问题描述】:

上下文

我正在尝试对一些文本执行lemmatization,我发现我可以为此使用 CI4 本地化。基本上我在 \App\Languages\ro-RO 中创建了一些文件,我正在将这些单词“翻译”到它们的语言根。

语言文件以 UTF-8 编码(我在服务器上使用file -i 命令检查了它)。 PHP 将 UTF-8 作为默认字符集。 Apache 有一个AddDefaultCharset UTF-8 设置。

每个页面的标题都有一个正确的声明header('Content-Type: text/html; charset=UTF-8');。在 CI 中,我使用 public $charset = 'UTF-8'public $defaultLocale = 'ro-RO'; 配置了 App.php。在所服务的每个页面的标题中,我还输入了命令:

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');
mb_regex_encoding('UTF-8');

问题

只要标签包含罗马尼亚语变音符号 ș 或 ț,lang() 函数就无法找到翻译。相反,它适用于其他罗马尼亚变音符号(ă、î 和 â)。显然 ș 和 ț 是拉丁语扩展 B 的一部分,而其他的则是拉丁语扩展 A。

奇怪的是,mb_ord() 不会为这些变音符号返回整数值。我做了一个小函数来获取每个单词并逐个字母地显示它以及字符代码。你可以看到结果($chunks 是一个包含单词的数组,clean_character 函数只是检查 mb_ord 是否返回一个整数):

  private function displayTextInfo( $chunks ) {
    for ($i=0; $i<count($chunks); $i++):
      echo $chunks[$i] . ' - ';
      for ($j=0; $j<strlen($chunks[$i]); $j++):
        $char = substr($chunks[$i], $j, 1);
        if ( $this->clean_character($char) ) {
          echo $char . '(' . mb_ord( $char, 'UTF-8' ) . ') ';
        } else {
          echo $char . '(???)';
        }
      endfor;
      echo '<br>';
    endfor;
  }

formaţiune - f(102) o(111) r(114) m(109) a(97) �(???)�(???)i(105) u(117) n(110) e(101)
depăşit - d(100) e(101) p(112) �(???)�(???)�(???)�(???)i(105) t(116)

我在互联网上走来走去,但找不到对此的解释。我没有主意了。

有什么想法吗?

【问题讨论】:

标签: php utf-8 codeigniter-4


【解决方案1】:

阅读了很多关于Unicode和罗马尼亚变音符号的文章,我了解了一点历史。微软似乎在罗马尼亚字符集的早期犯了一个错误,将șț 歪曲为şţ。您可能没有注意到区别,但是有:第一个字符在 s 和 t 下方有一个逗号,而后者有一个 cedilla。人眼几乎看不到它,但计算机更具洞察力:-)。 Unicode 是纠正这个错误的第一个标准,但它带来了很多问题,因为很多数据已经使用了“错误”字符。这使得罗马尼亚语的文本搜索变得更加复杂。

这其实也是我的问题。语言文件以 UTF-8 正确编码,但它们很可能是使用 ISO-8859-2 创建的,其中包含 ș 和 ț 的“错误”字符。我只需要将“错误”字符完全替换为“正确”字符。

我在这里记录了这一点,希望它对将来的某人有所帮助,因为注意到 ș 和 ț 的两种表示之间的微小视觉差异并不是小菜一碟。这让我沮丧了一天。

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 2011-04-19
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多