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


Odd behavior from mb_strlen when calling it through two functions

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

当我直接使用这个函数时,它似乎工作得很好。然而,当从另一个函数中调用该函数时,它似乎会破坏代码。

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

举个例子,我将使用"Ekrem Ergün"这个名字。通过makesortname()运行它应该返回"ErgünKrem",然后在使用accent()后应该变成"ErgunEkrem"。

我的accent()函数使用mb_strlen(),然后针对一个表运行字符串中的每个字符来检查重音。如果我打印出每个字符来测试它,我会注意到mb_strlen只报告了5个字符,而不是10个字符,并且"ünKre"被视为一个字符(这解释了为什么重音没有被去除,因为它检查的是那个字符串,而不仅仅是"ü")。

显然,问题似乎是我在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表中还有一个编码问题。

现在所有这些都已修复,该函数将按预期工作。

感谢大家的帮助和贡献!