You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP拉脱维亚语拼字游戏计分器输出异常问题求助

解决PHP拉脱维亚语拼字游戏分数计算函数的UTF-8字符识别问题

问题根源

函数计算分数不符的核心原因是PHP默认字符串处理按字节而非UTF-8字符操作:

  • 拉脱维亚语带重音字符(如ģ、ķ、č)属于UTF-8多字节字符,每个字符占2个字节
  • strlen($mot)统计的是字节数而非实际字符数,输入"fģhķč"的字节数为9,远大于实际字符数5
  • 循环中$mot[$i]取到的是单个字节,不是完整的拉脱维亚语字符,这些字节无法匹配数组里的完整字符,因此大部分进入else分支加1分,导致总分远低于预期。

修复方案

使用PHP mbstring扩展的函数处理多字节字符串,确保每次提取完整的UTF-8字符:

  1. 用mb_strlen($mot, 'UTF-8')获取实际的UTF-8字符数量
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:25:22