Мне часто приходится удалять акценты из строк, поэтому я написал функцию accent (), чтобы управлять этим более эффективно. Это работало хорошо, но недавно я столкнулся с некоторыми персонажами, которые не были проанализированы правильно. Это оказалось проблемой кодирования (что еще?), Поэтому я полностью переписал свой код … и теперь я сталкиваюсь с новой проблемой.
Когда я использую функцию напрямую, она работает нормально. Однако, когда функция вызывается из другой функции, кажется, что она нарушает код.
Вторая функция, makeortname (), обрабатывает создание имен сортировки. Он делает кучу вещей, а затем пропускает результат через accent (), чтобы убрать любые акценты.
В качестве примера я возьму имя «Экрем Эргюн». Предполагается, что при его запуске через makeortname () возвращается «ErgünEkrem», который затем должен стать «ErgunEkrem» после использования accent ().
Моя функция accent () использует mb_strlen (), а затем запускает каждый символ в строке для таблицы, чтобы проверить наличие акцентов. Если я распечатываю каждый символ для проверки, я замечаю, что mb_strlen сообщает только о 5 символах вместо 10 и что ünEkre обрабатывается как ОДИН символ (что объясняет, почему ударение не удаляется, так как он проверяет для этой строки вместо просто «ü»).
По-видимому, проблема заключается в том, что я использую utf8 в функции mb_strlen. Дело в том, что, если я его не включу, код не всегда работает, в зависимости от строки. И в этом конкретном случае его удаление только фиксирует длину строки, но по-прежнему не обрабатывается (даже если я удаляю также utf8 из mb_substr).
Вот код, который я использую.
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;
}
Для полного раскрытия я также включу функцию makeortname (), хотя я сомневаюсь, что это как-то связано с проблемой …
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 также была проблема с кодировкой.
Теперь, когда все это исправлено, функция работает как положено.
Спасибо всем за помощь и вклад!
Других решений пока нет …