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;

}

誰かが私に何ができるかについて何か考えを持っているなら、私に知らせてください.

アップデート:

これが必要な理由は、辞書のように、ノルウェー語と中国語の単語を含む行を含むテキスト ファイルを解析しようとしているからです。行を文字列に分割したいと思います。1 つはノルウェー語を含み、もう 1 つは中国語を含みます。これは後でデータベースに挿入されます。例の行:

impulsiv 形 衝動力</p>

imøtegå 動反對、反駁</p>

imøtekomme 動符合

alkoholmisbruk(er) 名氾濫用酒精 (名氾濫用酒精的人)

alkoholpåvirket 形 受酒精影響的

alkotest 名 呼吸性酒精測試</p>

alkymi(st) 名煉金術 (名煉金術士)

all, alt, alle, 形全部, すべて

ご覧のとおり、単語間にスペースが入っている可能性があるため、爆発のような簡単なものを使用して中国語とノルウェー語の単語を分割することはできません。私がしているのは、 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

PHP スクリプト ファイルが UTF-8 ではなく ANSI エンコーディングを使用している場合、バイト レベルでは、これらのノルウェー文字は UTF-8 でエンコードされている場合とは異なります。PHP はテキスト処理言語ではなく、バイト処理言語であるため、適切にバイト シーケンスを比較し、それらが一致しないと結論付けます。

これを解決するには、比較対象の文字セットと PHP スクリプトのエンコードが同じであることを確認するか、iconv または mbstring ライブラリを使用して適切な文字セットに変換します。

また、まだ読んでいない場合は、こちらをお読みください: http://www.joelonsoftware.com/articles/Unicode.html

更新:
考慮に入れるもう 1 つのポイントは、この関数に渡すものが、あなたが思っているとおりであることを確認することです。配列インデックス演算子を使用して文字列を一度に 1 文字ずつループしている場合、UTF-8 文字列は 2 バイト (2 つの配列インデックス位置) を使用して 1 文字を格納する可能性があるため、機能しません。mbstring には、バイト位置ではなく文字位置に基づいて文字列からテキストをコピーする関数があります。

于 2008-10-03T12:54:14.630 に答える
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 に答える
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

問題はノルウェー語の単語と中国語の単語を区別することなので、アルゴリズムに頼るのではなく、明示的なグリフを使用してそうしないのはなぜですか (私は個人的に「¶」が好きです)。

impulsiv¶形 衝動</p>

次に、mb-split、またはmb-substrをmb-strposと組み合わせて使用​​します。

文字列を出力する必要がある場合は、簡単にスペースに置き換えることができます!

悲しいことに、PHP の PCRE では、スクリプト名で \p を使用することはできません。

(私が何を意味するかを理解するために、§「Unicode 文字プロパティ」でregexp.referenceの「InMusicalSymbols」を探してください)

于 2008-10-05T17:57:15.283 に答える
0

私の知る限り、Web サーバーにアクセスできる場合は、mbstring ( http://www.php.net/manual/en/ref.mbstring.php ) エクステンションをインストールすることをお勧めします。

于 2008-10-03T12:56:10.850 に答える
0

utf8 エンコードとデコードの関数を使用してみてください。役立つかもしれません

于 2008-10-03T13:01:44.803 に答える
0

mbstring 拡張機能がインストールされているかどうかを確認します

于 2008-10-03T12:50:57.740 に答える