mb_strlen通过两个函数

时间:2015-11-05 14:26:25

标签: php utf-8 character-encoding strlen non-ascii-characters

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

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

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

作为一个例子,我将取名为“EkremErgün”。通过makesortname()运行它应该返回“ErgünEkrem”,然后应该在使用accent()之后变成“ErgunEkrem”。

我的accent()函数使用mb_strlen()然后针对表运行字符串中的每个字符以检查重音。如果我打印出每个字符来测试它,我注意到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;
    }

1 个答案:

答案 0 :(得分:0)

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

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

此外,我的mysql表中也存在编码问题。

现在所有这些都已修复,该功能按预期工作。

感谢您的帮助和贡献,大家!