通过两个函数调用时 mb_strlen 的奇怪行为

Odd behavior from mb_strlen when calling it through two functions

我经常需要从字符串中去除重音符号,所以我编写了一个名为 accent() 的函数来更有效地管理它。它工作得很好,但我最近 运行 进入了一些没有被正确解析的字符。结果证明这是一个编码问题(还有什么?)所以我完全重写了我的代码...现在我 运行 遇到了一个新问题。

当我直接使用该函数时,它似乎工作正常。但是,当从另一个函数中调用该函数时,它似乎破坏了代码。

第二个函数 makesortname() 处理排序名称的创建。它做了很多事情,然后通过 accent() 运行结果以去除任何重音。

例如,我将取名字 "Ekrem Ergün"。 运行 它通过 makesortname() 应该 return "ErgünEkrem" 然后 应该 在使用 accent() 之后变成 "ErgunEkrem"。

我的 accent() 函数使用 mb_strlen() 然后根据 table 运行字符串中的每个字符来检查重音。如果我打印出每个字符来测试它,我注意到 mb_strlen 只报告 5 个字符而不是 10 个并且 'ünEkre' 被视为一个字符(这解释了为什么重音没有被去除,因为它正在检查该字符串,而不仅仅是“ü”)。

显然,问题似乎是我在 mb_strlen 函数中使用了 'utf8'。问题是,如果我不包含它,代码并不总是有效,具体取决于字符串。在这种特定情况下,删除它只会修复字符串长度,但 ü 仍然不会被解析(即使我也从 mb_substr 中删除 'utf8')。

这是我正在使用的代码。

function accent($term)
    {
    $orstr = $term;
    $str2 = $orstr;
    $strlen = mb_strlen($orstr, utf8);
    for( $i = 0; $i < $strlen; $i++ )
        {
        $char = mb_substr($orstr, $i, 1, utf8);

        $chkacc = mysql_db_query("Definitions","SELECT NoAcc_col FROM tbl_Accents WHERE Letr_col = '$char' ");
            while($row = mysql_fetch_object($chkacc))
                $noacc = $row->NoAcc_col;
            mysql_free_result($chkacc);

        if($noacc != '')    $newchar = $noacc;
        else                $newchar = $char;

        $str2 = str_replace($char, $newchar, $str2);
        unset($noacc);
        }
    return $str2;
    }

为了全面披露,我还将包括 makesortname() 函数,尽管我怀疑它与问题有任何关系...

function makesortname($nameN)
    {
    $nameN = dashnames($nameN);
    $wordlist = explode(' ', $nameN, 2);
    $wordc = count($wordlist);

    if($wordc == 1)             $nameS = $wordlist[0];
    if($wordc == 2)             $nameS = $wordlist[1] . $wordlist[0];

    $nameS = str_replace(' ', '', $nameS);          $nameS = str_replace(',', '', $nameS);
    $nameS = str_replace(':', '', $nameS);          $nameS = str_replace(';', '', $nameS);
    $nameS = str_replace('.', '', $nameS);          $nameS = str_replace('-', '', $nameS);
    $nameS = str_replace("'", '', $nameS);          $nameS = str_replace('"', '', $nameS);
    $nameS = str_replace("(", '', $nameS);          $nameS = str_replace(")", '', $nameS);
    $nameS = str_replace("]", '', $nameS);          $nameS = str_replace("[", '', $nameS);
    $nameS = str_replace("/", '', $nameS);
    $nameS = str_replace("&", 'and', $nameS);
    $nameS = strtolower(accent($nameS));

    return $nameS;
    }

所以我设法解决了自己的问题!

我编写了一个新函数来检查字符串的编码,然后允许我根据编码使用 strlen/substr() 或 mb_strlen/mb_substr()。

此外,我的 mysql table.

中也存在编码问题

既然所有这些都已修复,该功能将按预期运行。

感谢大家的帮助和贡献!