未定义的偏移和变音符号

时间:2013-03-31 01:12:22

标签: php utf-8 southeast-asian-languages

我正在尝试使用Laotian解析utf8_ireplace文字,而我正在

  

未定义的抵消通知。

我能看到的一件事是有变音符号。那会引起警告吗?或者有人能给我一个线索,为什么它总是老挝(我正在处理的6种语言)?

对于utf8_replace,是否应该采用不同的方式处理老挝语和类似语言(如藏语)?它是一个众所周知的问题,它会引起那些语言中某些字符的注意吗? diacritcals是问题还是其他什么?除了关闭通知报告之外,有谁知道如何不通知?

更新:实际上我在老挝补充说,单词之间没有空格,所以你必须将字符串分开,这就是我使用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 个答案:

答案 0 :(得分:0)

我认为偏移误差可能是指preg_match中使用的正则表达式。我已经测试了正则表达式&#39; lo&#39;使用regex101.com并返回此错误:

  

\ x {30EFF} 字符偏移太大。将其减少到4十六进制   字符或启用UTF-16(u-modifier)

其他正则表达式测试得很好。