2016-06-22 3 views
0

Ich habe viele Artikel gelesen, aber immer noch nicht, dass ich es bekommenUTF-8 Hebrew Codierung und große Fragezeichen

Im Text aus Datei importieren

mit
$fp = fopen($storagename, 'r'); 
while (!feof($fp)){ 
    $line = fgets($fp, 2048); 
    $delimiter = "\t"; 
    $data = str_getcsv($line, $delimiter); 

    print_r($data); 
} 

Für Zahlen und Englisch charachters richtig angezeigt i hatte

str_replace("\x00", '', $data[7]) 

Aber jetzt verwenden versuchen, hebräisch charachters wie

suchen landet anzuzeigen

ich versucht habe, mit iconv/mb_convert_encoding/utf8_decode/kodieren Nichts hilft ..

Alle

groß Unterstützung Umwandlung wird
+4

Sie können nicht einfach zufällige Bytes aus einer Textdatei entfernen, um sie anzuzeigen, das ist nicht, wie Textcodierung funktionieren soll. Sie müssen unbedingt die Kodierung der Textdatei bestimmen (ich vermute, es könnte eine Variation von UTF-16 sein), die Kodierung Ihrer App kennen und die richtigen Konvertierungsfunktionen wie mb_convert_encoding() oder iconv() verwenden. –

+0

Nun, ich habe diese Daten nicht, wie kann ich die Codierung der TXT-Datei herausfinden? –

+1

Sie müssen raten. Laden Sie es in einem guten Editor oder in Ihrem Browser und ändern Sie die Codierung, bis es gut aussieht. –

Antwort

2

UCS-2 eine ältere Version von UTF-16, so sollten Sie vielleicht versuchen, beide (automatische Erkennung von Text ist kein kugelsicherer Job).

Wir haben die Quellcodierung. Wir können spekulieren, dass die Zielkodierung UTF-8 ist (weil es die vernünftige Wahl im Jahr 2016 ist und Ihre Frage tatsächlich als UTF-8 markiert ist). Wir haben also alles was wir brauchen.

Wir sollten zunächst Nicht-Standard-Roh-Byte-Manipulationen entfernen (z. B. entfernen str_replace("\x00", '', $data[7]) und ähnlichen Code). Wir können dann eine korrekte Umwandlung vornehmen. Wenn Sie mb_convert_encoding() verwenden, könnte ein erster Ansatz sein:

$delimiter = "\t"; 
$fp = fopen($storagename, 'r'); 
while (!feof($fp)){ 
    $line = mb_convert_encoding(fgets($fp, 2048), 'UTF-8', 'UCS-2LE'); 
    $data = str_getcsv($line, $delimiter); 
    print_r($data); 
} 

Sie die Liste der supported encodings überprüfen können.

Aber wir haben ein potenzielles Problem hier: Es gibt keine Möglichkeit, str_getcsv() über die Dateicodierung zu sagen, so ist es unwahrscheinlich, dass es Ihre UCS-2 Zeilenenden erkennt.

Je nach Größe der CSV-Datei können Sie verschiedene Lösungen ausprobieren. Wenn es klein ist, konvertiere ich es einfach sofort. Ansonsten werde ich einen Blick auf stream_get_line() haben:

Diese Funktion nahezu identisch mit fgets ist(), außer, dass es Zeilenende Trennzeichen anderen ermöglicht als die Standard \ n, \ r und \ r \ n und gibt das Trennzeichen nicht selbst zurück.

Es wäre so etwas wie dieses:

$ending = mb_convert_encoding("\n", 'UCS-2LE', 'UTF-8'); 
$line = mb_convert_encoding(stream_get_line($fp, 2048, $ending), 'UTF-8', 'UCS-2LE'); 

Dies sollte mit beiden Zeilenenden Unix arbeiten (\n) und Windows Einsen (\r\n).

Verwandte Themen