Неопределенные смещения и диакритические знаки

Я пытаюсь разобрать Laotian текст с utf8_ireplace и я получаю

неопределенное уведомление о смещении.

Единственное, что я вижу, это то, что есть диакритические знаки. Это вызвало бы это предупреждение? Или кто-то может дать мне понять, почему это всегда будет лаосский (из 6 языков, которые я обрабатываю)?

Есть ли особый способ, которым лаосский и подобные языки (такие как тибетский) должны обрабатываться по-разному в отношении utf8_replace? Это известная проблема, что она вызывает уведомления с некоторыми символами на этих языках? Являются ли диакритические знаки проблемой или чем-то еще? Кто-нибудь знает, как не получать уведомления, кроме отключения уведомлений?

Обновление: На самом деле, я добавляю, что в лаосском языке нет пробелов между словами, поэтому вы должны разделять строки символов, и именно для этого я использую utf8_replace, но для лаосского это не работает, даже если кажется, что он работает для тайского языка, например. Так что на самом деле я пытаюсь разбить строки символов, но по какой-то причине смещения не определены. Кажется, у тибетца тоже есть проблемы, например, "α╜ª"

Обновить

Вот главный вопрос: почему я получаю уведомления, используя utf8_replace на несколько слов на лаосском языке?

(Joomla)

// Iterate through the terms and test if they contain the relevant characters.
for ($i = 0, $n = count($terms); $i < $n; $i++)
{
    $charMatches = array();
    if ($lang === 'zh')
    {
        $charCount = preg_match_all('#[\x{4E00}-\x{9FCF}]#mui', $terms[$i], $charMatches);
    }

    elseif ($lang === 'ja')
    {
        // Kanji (Han), Katakana and Hiragana are each checked
        $charCount = preg_match_all('#[\x{4E00}-\x{9FCF}]#mui', $terms[$i], $charMatches);
        $charCount += preg_match_all('#[\x{3040–\x{309F}]#mui', $terms[$i], $charMatches);
        $charCount += preg_match_all('#[\x{30A0}-\x{30FF}]#mui', $terms[$i], $charMatches);
    }
    elseif ($lang === 'th')
    {
        $charCount = preg_match_all('#[\x{0E00}-\x{0E7F}]#mui', $terms[$i], $charMatches);
    }
    elseif ($lang === 'km')
    {
        $charCount = preg_match_all('#[\x{1780}-\x{17FF}]#mui', $terms[$i], $charMatches);
    }
    elseif ($lang === 'lo')
    {
        $charCount = preg_match_all('#[\x{0E80}-\x{30EFF}]#mui', $terms[$i], $charMatches);
    }
    elseif ($lang === 'my')
    {
        $charCount = preg_match_all('#[\x{1000}-\x{109F}]#mui', $terms[$i], $charMatches);
    }
    elseif ($lang === 'bo')
    {
        $charCount = preg_match_all('#[\x{0F00}-\x{0FFF}]#mui', $terms[$i], $charMatches);
    }
    // Split apart any groups of characters.
    for ($j = 0; $j < $charCount; $j++)
    {
        if (isset($charMatches[0][$j]))
        {
            $tSplit = JString::str_ireplace($charMatches[0][$j], '', $terms[$i], null);

            if (!empty($tSplit))
            {
                $terms[$i] = $tSplit;
            }
            else
            {
                unset($terms[$i]);
            }

            $terms[] = $charMatches[0][$j];
        }
    }
}

// Reset array keys.
$terms = array_values($terms);

1 ответ

Решение

Я думаю, что ошибка смещения может относиться к регулярному выражению, используемому в preg_match, Я протестировал регулярное выражение для 'lo', используя http://regex101.com/, и он возвращает эту ошибку:

\ x {30EFF} Смещение символа слишком велико. Уменьшите его до 4 шестнадцатеричных символов или включите UTF-16 (u-модификатор)

Другие регулярные выражения проверены просто отлично.

Другие вопросы по тегам