Php 未定义的偏移量和变音符号

Php 未定义的偏移量和变音符号,php,utf-8,southeast-asian-languages,Php,Utf 8,Southeast Asian Languages,我正试图用utf8\u ireplace解析Laotian文本,我得到了一个 未定义的抵销通知 我能看到的一件事是有变音符号。这会引起警告吗?或者有人能告诉我为什么总是老挝语(我正在处理的6种语言) 关于utf8\u replace,老挝语和类似语言(如藏语)是否有特殊的处理方式?这是一个已知的问题,它提出了一些字符在这些语言的通知?这是个问题还是别的什么?除了关闭通知报告之外,有人知道如何不获取通知吗 更新:事实上,我要补充的是,在老挝语中,单词之间没有空格,所以你必须分隔字符串,这就是我使用

我正试图用
utf8\u ireplace
解析
Laotian
文本,我得到了一个

未定义的抵销通知

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

关于
utf8\u replace
,老挝语和类似语言(如藏语)是否有特殊的处理方式?这是一个已知的问题,它提出了一些字符在这些语言的通知?这是个问题还是别的什么?除了关闭通知报告之外,有人知道如何不获取通知吗

更新:事实上,我要补充的是,在老挝语中,单词之间没有空格,所以你必须分隔字符串,这就是我使用utf8_替换的原因,但这对老挝语来说是失败的,尽管它似乎适用于泰语。所以我真的在尝试拆分字符串,但由于某些原因,偏移量是未定义的。藏语似乎也有问题,例如“α”╜ª“

更新 这里有一个中心问题:为什么我在老挝的一些单词上使用了
utf8\u replace

(约姆拉)

//遍历术语并测试它们是否包含相关字符。
对于($i=0,$n=count($terms);$i<$n;$i++)
{
$charMatches=array();
如果($lang=='zh')
{
$charCount=preg_match_all('#[\x{4E00}-\x{9FCF}]#mui',$terms[$i],$charMatches);
}
elseif($lang=='ja')
{
//汉字(韩文)、片假名和平假名均已检查
$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);
}
//拆分任何字符组。
对于($j=0;$j<$charCount;$j++)
{
if(isset($charMatches[0][$j]))
{
$tSplit=JString::str_ireplace($charMatches[0][$j],“”,$terms[$i],null);
如果(!空($tSplit))
{
$terms[$i]=$tSplit;
}
其他的
{
未结算($条款[$i]);
}
$terms[]=$charMatches[0][$j];
}
}
}
//重置数组键。
$terms=数组_值($terms);

我认为偏移量错误可能指的是
preg\u match
中使用的正则表达式。我已使用测试正则表达式的'lo'值,它返回此错误:

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


其他正则表达式测试正常。

请发布相关代码。我实际上没有my或bo(缅甸或藏语)样本数据,但我有泰语、日语、中国传统语和老挝语。我不明白为什么这不是一个真正的问题。我想知道在处理变音符号方面是否存在问题,或者在处理老挝语方面是否存在其他问题。我不知道这怎么不是一个真正的问题。我会尝试重新措辞。请提供一些输入数据要测试发生了什么?即使对于您自己的单元测试,这也会有所帮助。因此,也许可以将代码包装到函数
splitWords($lang,array$terms)
中,并提供输入。也许这是您的PHP版本的一个错误?-在处尝试代码。您是否正确配置了内部编码,并且您的输入数据是否真的经过UTF-8编码?
// 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);