PHP utf8问题
在比较带有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; }
如果有人对我能做些什么有任何想法,请告诉我。
更新:
之所以需要这样做,是因为我试图解析一个文本文件,其中包含带有挪威语和中文单词的行,例如字典。我想将行拆分为字符串,一个包含挪威词,另一个包含中文。稍后将其插入数据库中。示例行:
冲动的
我吗?
im?tekomme
alkoholmisbruk(er)()
alkoholp?virket
Alkotest
烷基(st)()
所有,另类,全部,
如我们所见,单词之间可能会有空格,因此我无法使用诸如explode这样的简单方法在中文和挪威语单词之间进行拆分。我要做的是使用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);
解决方案
首先,如果没有其他人回答,我将在稍后进入UTF-8,像遍历一样进行迭代是搜索数组的一种非常不好的方法。 PHP为此提供了内置函数:
http://fr.php.net/array_search
因此,我们可能需要尝试一下,看看它是否对问题有帮助。另外,请确保我们正在编写的PHP文件也以UTF-8编码!
更新:
尝试以下代码,在我的服务器上可以正常工作。如果不起作用,请检查默认情况下是否已将PHP配置为可与UTF-8配合使用,或者添加必要的ini_set调用。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>norvegian utf-8 test</title> <meta http-equiv="Content-type" value="text/html; charset=UTF-8" /> </head> <body> <?php function isSpecial($char) { $special_chars = array("?", "?", "?", "か"); return (array_search($char, $special_chars) !== false); } if (isset($_REQUEST["char"])) { echo $_REQUEST["char"].(isSpecial($_REQUEST["char"])?" (true)":" (false)"); } ?> <form method="POST" accept-charset="UTF-8"> <input type="text" name="char"> <input type="submit" value="submit"> </form> </body> </html>
查看我们是否安装了mbstring扩展名
如果PHP脚本文件使用ANSI编码而不是UTF-8,则在字节级别上,这些挪威字符将不同于使用UTF-8编码时的挪威字符。由于PHP是字节处理语言,而不是文本处理语言,因此它会适当比较字节序列并得出不匹配的结论。
要解决此问题,可以确保PHP脚本具有与要比较的字符集相同的编码,或者可以使用iconv或者mbstring库转换为适当的字符集。
另外,如果我们尚未阅读,请阅读以下内容:http://www.joelonsoftware.com/articles/Unicode.html
更新:
我们要考虑的另一点是,要确保传递给此函数的是我们想的。如果使用数组索引运算符一次在一个字符串中循环一个字符,那么它将不起作用,因为UTF-8字符串可能使用两个字节(两个数组索引位置)来存储一个字符。 mbstring中有一些功能可以根据字符位置(而不是字节位置)从字符串中复制文本。
据我所知,如果可以访问Web服务器,最好的选择是安装mbstring(http://www.php.net/manual/zh/ref.mbstring.php)扩展区。
尝试使用用于utf8编码和解码的功能。可能有帮助
我终于弄明白了。这样做可能不是一个好方法,但是它可以工作。
似乎我正在使用的数组与输入字符的字符集不同。我通过制作所有数组元素的字符串来解决此问题,然后使用mb_strpos搜索字符。因此,对代码的唯一更改是isNorwegianChar函数。新功能如下所示:
function isNorwegianChar($Char) { $sNorwegianChars = "'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ??????=() -,"; if(mb_strpos($sNorwegianChars, $Char)) { return true; } else { return false; } }
感谢我们提供的所有帮助!
由于问题在于将挪威语单词与中文单词分开,为什么不使用显式字形(我个人喜欢"?")而不是依靠算法呢?
冲动的?
然后将mb-split或者mb-substr与mb-strpos结合使用。
如果需要输出字符串,可以轻松地用空格替换它!
可悲的是,PHP中的PCRE不允许我们将\ p与脚本名一起使用。
(在regexp.reference中的" Unicode字符属性"中查找" InMusicalSymbols",以了解我的意思)