PHP拉脱维亚语拼字游戏计分器输出异常问题求助
解决PHP拉脱维亚语拼字游戏分数计算函数的UTF-8字符识别问题
问题根源
函数计算分数不符的核心原因是PHP默认字符串处理按字节而非UTF-8字符操作:
- 拉脱维亚语带重音字符(如ģ、ķ、č)属于UTF-8多字节字符,每个字符占2个字节
strlen($mot)统计的是字节数而非实际字符数,输入"fģhķč"的字节数为9,远大于实际字符数5- 循环中
$mot[$i]取到的是单个字节,不是完整的拉脱维亚语字符,这些字节无法匹配数组里的完整字符,因此大部分进入else分支加1分,导致总分远低于预期。
修复方案
使用PHP mbstring扩展的函数处理多字节字符串,确保每次提取完整的UTF-8字符:
- 用
mb_strlen($mot, 'UTF-8')获取实际的UTF-8字符数量 - 用
mb_substr($mot, $i, 1, 'UTF-8')逐个提取完整字符
修改后的完整代码
<?php declare(strict_types=1); function punktudaudzums($mot){ $b10punkti = array("f","ģ","h","ķ","č"); $b8punkti = array("ļ","ž"); $b6punkti = array("ņ","š","ū"); $b5punkti = array("b","c","g"); $b4punkti = array("ē","ī","j"); $b3punkti = array("d","o","v","z"); $b2punkti = array("ā","k","l","m","n","p"); $b1punkti = array("a","e","i","r","s","t","u"); $total = 0; // 按UTF-8字符数循环,提取完整字符 for ($i=0; $i < mb_strlen($mot, 'UTF-8') ; $i++) { $char = mb_substr($mot, $i, 1, 'UTF-8'); if (in_array($char, $b10punkti)) { $total += 10; } elseif (in_array($char, $b8punkti)) { $total += 8; } elseif (in_array($char, $b6punkti)) { $total += 6; } elseif (in_array($char, $b5punkti)) { $total += 5; } elseif (in_array($char, $b4punkti)) { $total += 4; } elseif (in_array($char, $b3punkti)) { $total += 3; } elseif (in_array($char, $b2punkti)) { $total += 2; } else{ $total += 1; } } return $total; } // 测试输入,现在会输出正确的50 echo punktudaudzums("fģhķč");
额外注意事项
- 确保PHP文件保存为UTF-8无BOM编码,避免字符编码混乱
- 服务器需启用
mbstring扩展(大部分PHP环境默认已启用) - 你的测试代码能识别"č"是因为直接比较完整多字节字符,不存在拆分问题,因此结果正确
内容的提问来源于stack exchange,提问作者Aigars Belevičs
相关产品推荐
相关产品推荐

