【发布时间】:2015-11-05 14:26:24
【问题描述】:
我经常需要从字符串中去除重音符号,因此我编写了一个名为 Accent() 的函数来更有效地管理它。它运行良好,但我最近遇到了一些未正确解析的字符。原来这是一个编码问题(还有什么?)所以我完全重写了我的代码......现在我遇到了一个新问题。
当我直接使用该功能时,它似乎工作正常。但是,当从另一个函数中调用该函数时,它似乎会破坏代码。
第二个函数 makesortname() 处理排序名称的创建。它做了很多事情,然后通过accent() 运行结果以去除任何重音。
例如,我将取名为“Ekrem Ergü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;
}
【问题讨论】:
-
显示代码....您还使用了哪些其他功能?
substr()?引用字节为$string[0]? -
确认。我在测试中犯了一些错误。通过一些更改,我能够更好地评估这一点,但问题仍然没有解决。我将编辑我的问题并包含代码。
-
这样说吧:你的代码有问题。对您的代码应该做什么的描述对我们完全没有帮助,我们需要详细查看实际代码来帮助您。
-
好的,我已经编辑了我的问题(有关问题的更新,请参阅最后一段)并包含我的代码。
-
strtolower() 不支持字符集,所以这无济于事....使用 mb_strtolower() 来保证多字节安全
标签: php utf-8 character-encoding strlen non-ascii-characters