2009-08-25 5 views
2

Ich bin nicht so gut mit Codierung, aber ich bin sogar mit den Grundlagen hier fallen.Codierung in UTF-8 von PHP

Ich versuche, eine Datei zu erstellen, die als UTF-8

header("Content-Type: text/plain; charset=utf-8"); 
header("Content-disposition: attachment; filename=test.txt"); 
echo "test"; 
exit(); 

erkannt wird auch versucht,

header("Content-Type: text/plain; charset=utf-8"); 
header("Content-disposition: attachment; filename=test.txt"); 
echo utf8_encode("test"); 
exit(); 

ich dann die Datei mit dem Editor öffnen ++ und es sagt, dass seine aktuelle Codierung ANSI ist nicht UTF-8, was fehlt mir, wie sollte ich diese Datei ausgeben.

Ich werde schließlich eine XML-Datei von Produkten für das Affiliate Window-Programm ausgeben. Auch wenn es hilft Mein Webserver ist Centos, Apache2, PHP 5.2.8.

Vielen Dank im Voraus für jede Hilfe!

Antwort

7

Wie Filip sagte, Codierung ist kein intrinsisches Attribut einer Datei; Es ist implizit. Wenn Sie also nicht wissen, in welcher Kodierung eine Datei interpretiert werden soll, gibt es keine Möglichkeit, sie zu bestimmen. Das Beste, was Sie tun können, ist eine Vermutung. Dies ist vermutlich das, was Programme wie Notepad ++ tun. Da die tatsächlichen Daten, die Sie gesendet haben, in vielen verschiedenen Codierungen interpretiert werden können, wählt es nur den Kandidaten aus, der am besten gefällt. Für Notepad ++ scheint dies ANSI zu sein (was an sich eine ziemlich ungenaue Klassifizierung ist), während andere Programme auf etwas anderes zurückgreifen.

Der Grund, warum Sie die charset in einem HTTP-Header angeben müssen, ist genau, weil die Datei selbst diese Information nicht enthalten, so muss der Browser darüber informiert werden. Sobald Sie die Datei auf dem Datenträger gespeichert haben, ist diese Information nicht verfügbar.

Wenn die Datei, die Sie dienen werden ein XML-Dokument ist, haben Sie die Möglichkeit, die Codierung Informationen in dem Dokument setzen. Auf diese Weise bleibt es erhalten, nachdem die Datei auf der Festplatte gespeichert wurde. Z.B.wenn Sie mit utf-8, sollten Sie dies am Anfang Ihres Dokuments stellen:

<?xml version="1.0" encoding="utf-8" ?> 

Beachten Sie, dass abgesehen von immer die Meta-Informationen über die charset über, Sie müssen auch sicherstellen, dass die Daten, die Sie sind dienen tatsächlich utf-8 codiert. Das ist ungefähr das gleiche Szenario: Sie müssen implizit wissen, wofür Ihre Daten codiert sind. Die Funktion utf8_encode ist (trotz des Namens) explizit zum Konvertieren von iso-8859-1 in utf-8 gedacht. Wenn Sie es also auf bereits utf-8-codierten Daten verwenden, erhalten Sie es doppelt codiert mit dem Ergebnis von verzerrten Daten.

Zeichensätze sind nicht so kompliziert in sich. Das Problem ist, dass wenn Sie nicht darauf achten, die Dinge in Ordnung zu halten, werden Sie es vermasseln. Wann immer Sie eine Zeichenkette haben, sollten Sie absolut sicher sein, dass Sie wissen, in welcher Kodierung sie sich befindet. Andernfalls ist es keine Zeichenkette - es ist nur ein Blob von Binärdaten.

+1

Ich habe meine Antwort geändert, weil Sie mir die umfassendste Antwort gegeben haben. Danke für all das, es hat meinem Verständnis geholfen! Die Funktion utf8_encode hat mir sehr geholfen, weil ich Daten in der DB gespeichert habe. Danke noch einmal! – Lizard

6

test ist alles ASCII. Daher muss UTF-8 nicht verwendet werden.

Aber in der Tat sind die ersten 128 Zeichen des Unicode-Zeichensatz das gleiche wie ASCII des charset. Und UTF-8 verwendet für diese Zeichen den gleichen Code wie ASCII. Weitere Informationen finden Sie unter Wikipedia’s description of UTF-8.

+0

Wollen Sie damit sagen, dass ich viel mehr Datenausgabe und sehen, ob die Codierung dann korrekt angezeigt wird? – Lizard

+2

@Lizard: Sie müssen Zeichen verwenden, die nicht im ASCII-Zeichensatz enthalten sind, um Unterschiede zu erkennen. – Gumbo

5

Sobald Sie die Datei herunterladen es nicht trägt mehr die Informationen über die Kodierung, so Notepad ++ es aus dem Inhalt zu erraten hat. Es gibt eine Sache namens Byte-Order-Mark, die es ermöglicht, die UTF-Kodierungen durch Präfix im Inhalt anzugeben.

Siehe Frage "When a BOM is used, is it only in 16-bit Unicode text?".

Ich könnte mir vorstellen, so etwas wie echo "\xEF\xBB\xBF" verwenden, bevor die eigentlichen Inhalte zu schreiben wird Notepad ++ zwingen, die Datei korrekt zu erkennen.

+2

Ich würde nicht empfehlen, Stückliste zu verwenden. Es ist ziemlich exotisch. – troelskn

+2

UTF-8 ist so konzipiert, dass es von seinen Byte-Folgen erkannt werden kann. Sie benötigen die Stückliste nicht. Tatsächlich wird es nur von Microsoft implementiert, und seine Verwendung verursacht nur Probleme für Cross-Plattformen. – bucabay

+2

Während BOMs sicherlich nicht überall nützlich sind und ihre Verwendung sorgfältig geprüft werden sollte, ist die Angabe, dass sie exotisch sind oder nicht von Microsoft unterstützt werden, einfach falsch. Es wird von vielen Texteditoren auf MacOS X und Linux/BSD/Unix unterstützt. –

2

Es gibt keine Header für heruntergeladene TXT-Dateien. Wenn Sie am Ende dennoch versuchen, XML-Dateien zu erstellen, und Sie können den Zeichensatz in der XML-Deklaration angeben, versuchen Sie, eine einfache XML-Struktur zu erstellen und zu speichern/zu öffnen, dann sollte es funktionieren, solange das Betriebssystem utf-8 unterstützt , die jede moderne Linux-Distribution haben sollte.