Странное поведение из mb_strlen при вызове через две функции

Мне часто приходится удалять акценты из строк, поэтому я написал функцию 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;
}

-1

Решение

Так что мне удалось решить свою проблему!

Я написал новую функцию для проверки кодировки строки, которая затем позволяет мне использовать либо strlen / substr (), либо mb_strlen / mb_substr () в зависимости от кодировки.

Кроме того, в моей таблице mysql также была проблема с кодировкой.

Теперь, когда все это исправлено, функция работает как положено.

Спасибо всем за помощь и вклад!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]