3

将带有挪威字符的数组与 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 形变的</p>

imø动动,反对,</tåp>

imøtekomme 动 符合

alkoholmisbruker(名脂质人)

alkoholpåvirket 形受酒精影响的

alkotest 名呼吸性血液循环测试</p>

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

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

正如你所看到的,单词之间可能有空格,所以我不能使用像explode这样简单的东西来区分中文和挪威语单词。我所做的是使用 isNorwegianChar 并遍历该行,直到找到一个不在数组中的字符。

问题是 æ、ø 和 å 没有作为挪威字符返回,它认为中文单词已经开始。

这是代码:

   //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);
4

7 回答 7

3

首先,如果没有其他人回答,我稍后会使用 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>
于 2008-10-03T12:45:54.100 回答
3

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

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

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

更新:
您要考虑的另一点是确保您传递给此函数的内容是您认为的内容。如果您使用数组索引运算符一次遍历一个字符串,它将不起作用,因为您的 UTF-8 字符串可能使用两个字节(两个数组索引位置)来存储一个字符。mbstring 中有一些函数可以根据字符位置而不是字节位置从字符串中复制文本。

于 2008-10-03T12:54:14.630 回答
1

我终于弄明白了。这可能不是一个好方法,但它确实有效。

看起来我正在使用的数组与输入字符的字符集不同。我通过制作一个包含所有数组元素的字符串来解决这个问题,然后使用 mb_strpos 搜索字符。因此,对代码的唯一更改是 isNorwegianChar 函数。新函数如下所示:

function isNorwegianChar($Char)
{
    $sNorwegianChars = "'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZæÆøØåÅ=() -,";

    if(mb_strpos($sNorwegianChars, $Char))
    {
        return true;
    }
    else
    {
        return false;
    }
}

感谢所有的帮助!

于 2008-10-03T15:43:05.023 回答
0

尝试使用 utf8 编码和解码的函数。可能有帮助

于 2008-10-03T13:01:44.803 回答
0

查看是否安装了 mbstring 扩展

于 2008-10-03T12:50:57.740 回答
0

据我所知,如果您可以访问网络服务器,最好的办法是安装 mbstring ( http://www.php.net/manual/en/ref.mbstring.php ) 扩展。

于 2008-10-03T12:56:10.850 回答
0

由于问题是将挪威语单词与中文单词分开,您为什么不使用明确的字形来这样做(我个人喜欢“¶”),而不是依靠算法?

impulsiv¶形波动的</p>

然后使用mb-splitmb-substrmb-strpos结合使用。

如果您需要输出字符串,您可以轻松地将其替换为空格!

遗憾的是,PHP 中的 PCRE 不允许我们将 \p 与脚本名称一起使用。

(在regexp.reference的 §“Unicode 字符属性”中查找“InMusicalSymbols”,以了解我的意思)

于 2008-10-05T17:57:15.283 回答