2008-10-03 21 views
3

Ich habe einige Probleme beim Vergleich eines Arrays mit norwegischen Zeichen mit einem utf8 Zeichen.PHP utf8 Problem

Alle Zeichen außer den speziellen norwegischen Zeichen (æ, ø, å) funktionieren gut.

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; 

} 

Wenn jemand eine Idee über das, was ich tun kann, bitte, lassen Sie es mich wissen.

Update:

Der Grund dafür ist für die Notwendigkeit ist, dass ich versuche, eine Textdatei zu analysieren, die Linien mit norwegischen und den chinesischen Wörtern enthält, wie ein Wörterbuch. Ich möchte die Zeile in Strings aufteilen, eine mit dem norwegischen Wort und eine mit dem chinesischen. Dies wird später in eine Datenbank eingefügt. Beispiel Linien:

IMPULSIV 形 衝動 的

imøtegå 動 反對, 反駁

imøtekomme 動 符合

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

alkoholpåvirket

alkotest 測試 呼吸 性 酒精 測試

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

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

Wie Sie die Worte sehen, es kann sein könnte Räume zwischen so kann ich nicht etwas verwenden leicht explodieren, um zwischen den chinesischen und norwegischen Wörtern zu teilen. Was ich tue ist die isNorwegianChar und Schleife durch die Linie, bis ich ein Zeichen finde, das nicht im Array ist.

Das Problem ist, dass es æ, ø und å nicht als norwegisches Zeichen zurückgegeben wird und es glaubt, dass das chinesische Wort begonnen hat. Hier

ist der Code:

//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); 
+0

Welche Version von PHP? – leek

+0

Die PHP-Version ist 5.2.5 – Christoffer

+1

Sie könnten range() als Kurzschrift verwenden, wenn Sie Ihr Array erstellen. –

Antwort

3

Zunächst einmal, und ich werde auf UTF-8 erhalten später, wenn sonst niemand antwortet, Iterieren wie Sie sind ein sehr schlechter Weg ist durch eine Reihe zu suchen. PHP hat integrierte Funktionen nur für die:

http://fr.php.net/array_search

So könnten Sie geben möchten, dass ein versuchen und sehen, ob es mit Ihrem Problem hilft. Stellen Sie außerdem sicher, dass die von Ihnen geschriebene PHP-Datei auch in UTF-8 kodiert ist!

UPDATE:

Versuchen Sie, den folgenden Code, der auf meinem Server ganz gut funktioniert. Wenn dies nicht funktioniert, überprüfen Sie, ob PHP standardmäßig für die Verwendung von UTF-8 konfiguriert ist, oder fügen Sie die erforderlichen ini_set-Aufrufe hinzu.

<!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> 
+0

Danke für die Antwort. Ich benutzte Array-Suche, aber es sah nicht, dass das Array-ø das gleiche wie das UTF-8 ø war, also habe ich meine eigene Schleife gemacht, um verschiedene Codierungen und Zeug zu testen. Die PHP-Datei ist in UTF-8. – Christoffer

+0

@Chistoffer Ich schreibe eine Testdatei und versuche es auf meinem Server. Ich benutze UTF-8 ausgiebig, also weiß ich, dass ich alles UTF-8-weise richtig konfiguriert habe. – Gilles

+0

Vielen Dank :) – Christoffer

0

Sehen Sie, wenn Sie mbstring Erweiterung

+0

Ich habe es installiert. – Christoffer

3

installiert Wenn Ihr PHP-Script-Datei ein ANSI-Codierung hat, anstelle von UTF-8, dann auf der Byte-Ebene jene norwegischen Zeichen anders sein wird, was würden sie wenn sie in UTF-8 codiert sind. Da PHP eine Byteverarbeitungssprache und keine Textverarbeitungssprache ist, vergleicht es die Bytefolgen ordnungsgemäß und kommt zu dem Schluss, dass sie nicht übereinstimmen.

Um dies zu beheben, können Sie entweder sicherstellen, dass Ihr PHP-Skript die gleiche Kodierung wie der Zeichensatz hat, mit dem Sie vergleichen, oder Sie können die Bibliotheken iconv oder mbstring in entsprechende Zeichensätze konvertieren.

Auch wenn Sie es nicht gelesen haben, lesen Sie diese: http://www.joelonsoftware.com/articles/Unicode.html

Update:
ein weiterer Punkt, den Sie berücksichtigen ist, um sicherzustellen, dass, was Sie in dieser Funktion übergeben ist, was Sie denken es ist. Wenn Sie mit dem Array-Indizierungsoperator Zeichen für Zeichen durchlaufen, funktioniert das nicht, da Ihre UTF-8-Zeichenfolge möglicherweise zwei Byte (zwei Arrayindexpositionen) zum Speichern eines Zeichens verwendet. Es gibt Funktionen in mbstring, um Text aus Zeichenfolgen basierend auf Zeichenpositionen, nicht Bytepositionen, zu kopieren.

+0

Danke für die Antwort. Mein PHP-Skript wird als UTF-8 gespeichert, mbstring sagt, dass das Eingabe-Zeichen UTF-8 ist, aber die Array-Werte sind ASCII. – Christoffer

+0

ASCII unterstützt keine norwegischen Zeichen, ich nehme an, Sie meinen ANSI latin1. In Ihrem Fall würde ich nur die Zeichen ausgeben, die Sie vergleichen möchten, und sich deren Byte-Werte ansehen. –

0

Versuchen Sie, die Funktionen für utf8-Codierung und Decodierung zu verwenden. könnte helfen

1

Ich endlich herausgefunden. Es ist vielleicht kein schöner Weg, aber es funktioniert.

Es scheint, dass das Array, mit dem ich arbeitete, in einem anderen Zeichensatz als das Eingabezeichen war. Ich löste das, indem ich eine Zeichenkette aller Array-Elemente machte und dann mb_strpos benutzte, um nach den Zeichen zu suchen. Die einzige Änderung am Code ist die isNorwegianChar-Funktion. Die neue Funktion sieht so aus:

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

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

Danke für die Hilfe!

0

Da das Problem darin besteht, norvegische Wörter von chinesischen Wörtern zu trennen, warum verwenden Sie keine explizite Glyphe (ich persönlich mag "¶"), anstatt sich auf einen Algorithmus zu verlassen?

impulsiv¶ 形 衝動 的

Dann nutzen mb-split oder mb-substr mit mb-strpos kombiniert.

Sie können es leicht durch ein Leerzeichen ersetzen, wenn Sie die Zeichenfolge ausgeben müssen!

Leider erlaubt uns PCRE in PHP nicht, \ p mit script names zu verwenden.

(suchen Sie nach "InMusicalSymbols" in regexp.reference, in § "Unicode-Zeicheneigenschaften", zu verstehen, was ich meine)

+0

Danke für den Vorschlag! Der Grund dafür, kein Symbol zu verwenden und die Zeichenfolge für dieses Symbol aufzuteilen, liegt darin, dass die Datei mit der Zeichenfolge 22 000 Zeilen enthält. Und ich möchte 22k Zeilen nicht manuell bearbeiten. – Christoffer