【发布时间】: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)
我在互联网上走来走去,但找不到对此的解释。我没有主意了。
有什么想法吗?
【问题讨论】:
-
欢迎来到 Stack Overflow。请花2分钟tour。此外,打开Help center 并至少阅读How to Ask。然后,edit您的问题提供minimal reproducible example。
标签: php utf-8 codeigniter-4