加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP utf8问题

发布时间:2020-12-13 21:33:56 所属栏目:PHP教程 来源:网络整理
导读:将数组与挪威字符与utf8字符进行比较时遇到一些问题. 除特殊挪威字符(?,?,?)外的所有字符都可以正常工作. function isNorwegianChar($Char){ $aNorwegianChars = array('a','A','b','B','c','C','d','D','e','E','f','F','g','G','h','H','i','I','j','J','k
将数组与挪威字符与utf8字符进行比较时遇到一些问题.

除特殊挪威字符(?,?,?)外的所有字符都可以正常工作.

function isNorwegianChar($Char)
{
    $aNorwegianChars = array('a','A','b','B','c','C','d','D','e','E','f','F','g','G','h','H','i','I','j','J','k','K','l','L','m','M','n','N','o','O','p','P','q','Q','r','R','s','S','t','T','u','U','v','V','w','W','x','X','y','Y','z','Z','?','?','?','?','?','?','=','(',')',' ','-');
    $iArrayLength = count($aNorwegianChars);

    for($iCount = 0; $iCount < $iArrayLength; $iCount++)
    {
        if($aNorwegianChars[$iCount] == $Char)
        {
            return true;
        }
    }

    return false;

}

如果有人知道我能做什么,请告诉我.

更新:

需要这个的原因是我试图解析一个包含挪威语和中文单词的文本文件,比如字典.我想把这行分成字符串,一行包含挪威语,一行包含中文.稍后将将其插入数据库中.示例行:

impulsiv形冲动的

im?teg?动反对,反驳

im?tekomme动符合

alkoholmisbruk(er)名滥用酒精(名滥用酒精的人)

alkoholp?virket形受酒精影响的

alkotest名呼吸性酒精测试

alkymi(st)名炼金术(名炼金术士)

all,alt,alle,形全部,所有

正如你所看到的那样,这些单词之间可能存在空格,所以我不能使用像爆炸这样简单的东西来分割中文和挪威语.我所做的是使用isNorwegianChar并遍历该行,直到找到不在数组中的char.

问题在于?,?和?不是作为挪威人回归的,它认为中文这个词已经开始了.

这是代码:

//Open file.
$rFile = fopen("norsk-kinesisk.txt","r");

// Loop through the file.
$Count = 0;
while(!feof($rFile))
{
    if(40== $Count)
    {
        break;
    }

    $sLine = fgets($rFile);

    if(0 == $Count)
    {
        $sLine = mb_substr($sLine,3);
    }

    $iLineLength        = strlen($sLine);
    $bChineseHasStarted = false;
    $sNorwegianWord     = '';
    $sChineseWord       = '';
    for($iCount2 = 0; $iCount2 < $iLineLength; $iCount2++)
    {
        $char = mb_substr($sLine,$iCount2,1);

        if(($bChineseHasStarted === false) && (false == isNorwegianChar($char)))
        {
            $bChineseHasStarted = true;
        }

        if(false === $bChineseHasStarted)
        {
            $sNorwegianWord .= $char;
        }
        else
        {
            $sChineseWord .= $char;
        }

        //echo $char;
    }

    $sNorwegianWord = trim($sNorwegianWord);
    $sChineseWord = trim($sChineseWord);

    $Count++;
}

fclose($rFile);

解决方法

如果您的PHP脚本文件具有ANSI编码而不是UTF-8,那么在字节级别上,这些挪威字符将与它们以UTF-8编码时的字符不同.由于PHP是一种字节处理语言,而不是文本处理语言,因此它会对字节序列进行适当的比较,并得出它们不匹配的结论.

要解决此问题,您可以确保PHP脚本与您要比较的字符集具有相同的编码,或者您可以使用iconv或mbstring库转换为适当的字符集.

另外,如果您还没有阅读,请阅读:http://www.joelonsoftware.com/articles/Unicode.html

更新:您要考虑的另一点是确保您传入此功能的内容符合您的想法.如果您使用数组索引运算符一次循环一个字符串一个字符,它将无法工作,因为您的UTF-8字符串可能使用两个字节(两个数组索引位置)来存储一个字符. mbstring中有函数根据字符位置而不是字节位置从字符串中复制文本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读