首页 > 解决方案 > PHP:希伯来字母比较

问题描述

我正在尝试将希伯来语单词拆分为字母并获取相应符号的索引。我已经设置了 UTF-8 标头并检查了文件的编码实际上是 UTF-8。但由于某种原因,PHP 无法正确比较符号并且不返回所需的符号 ID,而如果我输出 $text 数组,它会很好地输出。我有一系列希伯来字母:

$id_symbols = array(
    280=>'א‬',
    281=>'בּ‬',
    282=>'ב‬',
    283=>'ג‬',
    284=>'ד‬',
    285=>'ה‬',
    286=>'ו‬',
    287=>'ז‬',
    288=>'ח‬',
    289=>'ט‬',
    290=>'י‬',
    291=>'כּ‬',
    292=>'כ‬',
    293=>'ךּ‬',
    294=>'ך‬',
    295=>'ל‬',
    296=>'מ‬',
    297=>'ם‬',
    298=>'נ‬',
    299=>'ן‬',
    300=>'ס‬',
    301=>'ע‬',
    302=>'פּ‬',
    303=>'פ‬',
    304=>'ף‬',
    305=>'צ‬',
    306=>'ץ‬',
    307=>'ק‬',
    308=>'ר‬',
    309=>'שׁ‬',
    310=>'שׂ‬',
    311=>'תּ‬',
    312=>'ת‬',
);

我向这样的页面发送发布请求:

header('Content-type: text/html; charset=utf-8');

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://pr.animizer.net/word-api.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "api_key=some_key&text=מילה&font=arial&font_size=30&fore_color=000000&back_color=FFFFFF&template=1,2,3&speed=4");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);

curl_close ($ch);

exit($server_output);

收到了一个 POST 请求,我正在尝试获取每个相应希伯来字母的密钥:

function mb_str_split($string) {
$strlen = mb_strlen($string);
while ($strlen) {
    $array[] = mb_substr($string,0,1,"UTF-8");
    $string = mb_substr($string,1,$strlen,"UTF-8");
    $strlen = mb_strlen($string);
}
return $array;
}

$text = mb_str_split($_POST['text']); //splitting text into symbols

foreach($text as $t){

    foreach($id_symbols as $key=>$value){
        if($value == $t){
            $word[] = $key;
        }
    }

}



print_r($word);

输出是

Array
(
)

PS 尝试在相同的文件中以相同的方式输出俄语字母,它们工作正常。看起来问题不是编码

标签: phphebrew

解决方案


您的代码的问题是符号数组。

代码的最后一部分尝试将 1 个符号(字符)与$id_symbols. 问题是这些元素都不是 1 个符号。它们分别是 2 个或 3 个符号,因此它们永远不会匹配。

这段代码会告诉你。

foreach($id_symbols as $key => $value) {
    echo $key.' '.$value.' '.json_encode($value)."\n";
}

输出:

280 א‬ "\u05d0\u202c"
281 בּ‬ "\u05d1\u05bc\u202c"
282 ב‬ "\u05d1\u202c"
283 ג‬ "\u05d2\u202c"
284 ד‬ "\u05d3\u202c"
285 ה‬ "\u05d4\u202c"
286 ו‬ "\u05d5\u202c"
287 ז‬ "\u05d6\u202c"
288 ח‬ "\u05d7\u202c"
289 ט‬ "\u05d8\u202c"
290 י‬ "\u05d9\u202c"
291 כּ‬ "\u05db\u05bc\u202c"
292 כ‬ "\u05db\u202c"
293 ךּ‬ "\u05da\u05bc\u202c"
294 ך‬ "\u05da\u202c"
295 ל‬ "\u05dc\u202c"
296 מ‬ "\u05de\u202c"
297 ם‬ "\u05dd\u202c"
298 נ‬ "\u05e0\u202c"
299 ן‬ "\u05df\u202c"
300 ס‬ "\u05e1\u202c"
301 ע‬ "\u05e2\u202c"
302 פּ‬ "\u05e4\u05bc\u202c"
303 פ‬ "\u05e4\u202c"
304 ף‬ "\u05e3\u202c"
305 צ‬ "\u05e6\u202c"
306 ץ‬ "\u05e5\u202c"
307 ק‬ "\u05e7\u202c"
308 ר‬ "\u05e8\u202c"
309 שׁ‬ "\u05e9\u05c1\u202c"
310 שׂ‬ "\u05e9\u05c2\u202c"
311 תּ‬ "\u05ea\u05bc\u202c"
312 ת‬ "\u05ea\u202c"

每个应该只有一个反斜杠,但它们都有 2 或 3。

第一个问题,它们都被终止\u202c。这个问题的解决方案很简单:只需删除它们。

第二个问题,即使删除所有\u202c,仍然有 7 个元素是 2 个符号宽。它们是 281, 291, 293, 302, 309, 310, 311。这个问题的解决方案:必须用它们的单个符号版本替换它们。

例如,索引 293 的元素是\u05da\u05bc,它可以替换为\ufb3a. 见https://codepoints.net/U+FB3A

我相信你可以处理剩下的 6 个符号。


推荐阅读