Неопределенные смещения и диакритические знаки
Я пытаюсь разобрать 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-модификатор)
Другие регулярные выражения проверены просто отлично.