it-swarm.com.de

Was ist "ANSI als UTF-8" und wie kann ich fputcsv () dazu bringen, UTF-8 mit Stückliste zu generieren?

Ich habe ein PHP Skript erstellt, das CSV-Dateien generiert, die zuvor von einem anderen Prozess generiert wurden. Und dann müssen die CSV-Dateien von einem weiteren Prozess importiert werden.

Der Import der alten CSV-Dateien funktioniert einwandfrei, aber beim Import der neuen CSV-Dateien treten Probleme mit Sonderzeichen auf.

Wenn ich alte CSVs mit Notepad ++ öffne, heißt es, dass die Codierung UTF-8 ist, und wenn ich die neuen CSVs damit öffne, heißt es, dass ihre Codierung 'ANSI as UTF-8' ist.

Was ist der Unterschied zwischen den beiden?

Und wie kann ich fopen und fputcsv dazu bringen, das 'pure' zu verwenden? UTF-8-Codierung?

Vielen Dank!

19
Petruza

Es ist nichts falsch mit der Datei. "ANSI als UTF-8" bedeutet, dass es keine Stückliste gibt, aber Notepad ++ hat die Codierung durch Analysieren von Bytemustern eindeutig als UTF-8 identifiziert. Ich habe dies getestet, indem ich eine Datei mit russischem, griechischem und polnischem Text erstellt und als UTF-8 ohne Stückliste gespeichert habe. Hier ist es:

# Russian
Следующая

# Greek
Επόμενη

# Polish
Więcej

Ich habe dies in einem anderen Editor (EditPad Pro) durchgeführt und den Hex-Modus verwendet, um sicherzustellen, dass die Stückliste nicht vorhanden ist. Als ich es in NPP öffnete, zeigte es die Kodierung als "ANSI als UTF-8" und alle Zeichen wurden korrekt angezeigt. Dann entfernte ich im Hex-Modus das erste Byte des ersten russischen Zeichens. Als ich es wieder in NPP öffnete, zeigte es die Kodierung als "ANSI" und zeigte die Nicht-ASCII-Teile des Textes als mojibake an:

; Russian
¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ

; Greek
Επόμενη

; Polish
Więcej

Zurück zu EditPad, und dieses Mal habe ich eine Stückliste hinzugefügt, aber das kyrillische Zeichen nicht repariert. Diesmal hat NPP die Codierung als "UTF-8" gemeldet und alles mit Ausnahme des ersten russischen Zeichens, wie unten gezeigt, korrekt angezeigt. "A1" ist die hexadezimale Darstellung des zweiten Bytes dieses Zeichens in UTF-8. Es wurde in einem umgekehrten Farbschema angezeigt, um einen Fehler anzuzeigen.

# Russian
A1ледующая

# Greek
Επόμενη

# Polish
Więcej

Zusammenfassend: In Abwesenheit einer Stückliste sucht Notepad ++ nach Bytes, die keine ASCII Zeichen darstellen können, da ihre Werte größer als 127 (oder 7F hex) sind. Wenn sie welche finden, aber alle mit den von UTF-8 geforderten Mustern übereinstimmen, dekodiert sie die Datei als UTF-8 und meldet die Kodierung in der Statusleiste als "ANSI als UTF-8".

Wenn jedoch auch nur ein Byte gefunden wird, das nicht der UTF-8-Zeile entspricht, wird die Datei als "ANSI" dekodiert, dh als Standard-Einzelbytekodierung für die zugrunde liegende Plattform. Wenn Ihre Datei beschädigt gewesen wäre, würden Sie das sehen.

BEARBEITEN: Obwohl Ihre Datei ohne sie gültig ist, können Sie eine Stückliste hinzufügen , indem Sie die drei Bytes "EF BB BF" ganz am Anfang der Datei manuell eingeben - aber es sollte einen besseren Weg geben. Wie generieren Sie den Inhalt jetzt? Weil esUTF-8 ist, mit mindestens einem Nicht-ASCII-Zeichen irgendwo; Andernfalls würde NPP dies als "ANSI" melden.

Eine weitere zu berücksichtigende Möglichkeit: Wenn Sie Einfluss auf den Prozess haben, der Ihre CSV-Datei verarbeitet, können Sie sie möglicherweise so konfigurieren, dass UTF-8 ohne Stückliste erwartet wird. Technisch gesehen ist jede Software, die UTF-8 mit einer Stückliste, aber nicht ohne einer dekodieren kann, defekt. Das Unicode-Konsortium rät tatsächlich von der Verwendung der UTF-8-Stückliste ab, nicht davon, dass jemand zuhört.

42
Alan Moore

Gemäß den mit Notepad ++ verwandten Threads hier und hier gibt 'ANSI als UTF-8' UTF-8 an ohne BOM, während ein einfaches 'UTF-8' UTF-8 bedeutet mit Stückliste. Vielleicht benötigt der Prozess, der die CSV liest, die Markierung Byte-Reihenfolge , um die CSV korrekt als UTF-8 zu lesen.

Aber bevor Sie damit anfangen, stellen Sie sicher, dass Ihr Skript tatsächlich UTF-8 schreibt! Wenn Sie die neuen CSVs in Notepad ++ öffnen (und 'ANSI as UTF-8' angezeigt wird), werden alle 'Sonderzeichen' korrekt angezeigt? Wenn nicht, müssen Sie Ihr Skript anpassen, um UTF-8 tatsächlich zu schreiben. Wenn ja, prüfen Sie, ob sich die Stücklisten unterscheiden.

6
Henrik Opel

Versuchen Sie auch, Ihr PHP -Skript in UTF-8 zu ändern. Manchmal ist es notwendig (obwohl es umgangen werden kann), das Skript in der gleichen Zeichencodierung der Daten zu haben.

Ähnliches Problem: PHP: Explosion mit Sonderzeichen

1
Havenard

Es ist erwähnenswert, dass ANSI als UTF-8, d. H. UTF-8 ohne Stückliste, nützlich ist, wenn Sie Ihre PHP -Dateien als UTF-8 formatieren. Wenn Ihre PHP -Datei HTML-Code an den Browser ausgibt, ist die Stückliste in der HTML-Ausgabe enthalten, vor der der w3c validator ausdrücklich warnt:

Byte-Order-Markierung in UTF-8-Datei gefunden.

Es ist bekannt, dass das Unicode-Byte-Order-Mark (BOM) in UTF-8-codierten Dateien bei einigen Texteditoren und älteren Browsern Probleme verursacht. Sie sollten in Betracht ziehen, die Verwendung zu vermeiden, bis sie besser unterstützt wird.

Außerdem habe ich festgestellt, dass die Stückliste den Firefox-Firebug verwirrt, der jetzt denkt, dass sich Ihr gesamter <head>-Inhalt tatsächlich im <body>-Tag befindet.

0
icc97