我经常不得不从字符串中去除重音符号,所以我编写了一个名为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表中还有一个编码问题。
现在所有这些都已修复,该函数将按预期工作。
感谢大家的帮助和贡献!