Tom: utf-8 und PHP und HTTP-Header des Webserver

Beitrag lesen

Hello Sven,

Es werden alle 8 Bit benutzt.
Das Bit 7 (80h  128d) wird eben zur Kennzeichnung der Umschaltung benutzt...

Auch das ist falsch.

Nö, das ist jetzt richtig. Ich hatte es ja verkehrt herum geschrieben und hier eben versucht richtigzustellen.

also nochmal in kleinen Schritten:
UTF-8 verwendet alle 8 Bit
ist Bit 7 nicht gesetzt, handelt es sich beim Zeichen sich um ein ASCII-Zeichen
ASCII ist also in UTF-8 eingebettet und damit eine Untermenge davon
  (ich hatte es falsch herum gesagt)
Ist Bit 7 gesetzt und Bit 6 nicht, dann wird das Zeichen in zwei Bytes codiert
Ist Bit 7 gesetzt und Bit 6 und Bit 5 nicht, dann wird das Zeichen in drei Bytes codiert
Ist Bit 7 gesetzt und Bit 6 und Bit 5 und Bit 4 nicht, dann wird das Zeichen in vier Bytes codiert

Da Bit 7 immer nur gesetzt sein kann, wenn ein Zeichen beginnt, ist UTF-8 selbstsynchoniesierend.

Ich kämpfe mich da gerade durch, wie man utf-8 und PHP unter einen Hut bringt.

Das ist eigentlich recht simpel, wenn man nur simple Dinge will. Wenn man kompliziertere Dinge will, muß man UTF-8-fähige oder Unicode-fähige Software einsetzen (bei PHP wäre das Stichwort "mbstring" (Multibyte-String) anzubringen).

Ich will eine viersprachige Webseite bauen, die ggf. auch alle vier Sprachen _gleichzeitig_ anzeigen können soll.

Setzt das jetzt voraus, dass die entsprechenden Zeichensätze zur Verfügung stehen, oder unterstützen Browser, die UTF-8 interpretieren können automatisch alle darstellbaren Zeichen?
Ich würde vermutren, dass nein ;-)

Was passiert also, wenn man in UTF-8 die wilden Zeichen irgendwelcher Aliens codiert hat und nun die Seite in USA anschaut. Die kennen da ja nur sich... Soll heißen, der Alienzeichnsatz ist nicht installiert. Kommen dann die hübschen Kästchen auf den Schirm?

Nächste Frage:
Mit welchem Editor und welcher Tastatur und welchen OS-Einstellungen bekomme ich denn die Alien-Texte überhaupt in die Maschine?

Welchen Header sendet der Webserver für die Zeichenkodierung?

Den üblichen. UTF-8 ist äquivalent zu ISO-8859-1 oder Windows-1252 in der Headerverwendung.

Das kann ich so nicht nachvollziehen.
Als ich

<?php  ### make_utf-8.php ###

error_reporting(E_ALL);
define('CRLF',chr(13).chr(10));

$text = "Die ärgerliche Straßenkrümmumg ödet uns an. Ein Ölfleck auf dem Ärmel lässt sich nicht überbügeln";

$fh = fopen('utf8-output.txt','a+');
fwrite ($fh, utf8_encode($text).CRLF);
fclose($fh);

header('Content-Type: text/html; charset=UTF-8');

echo utf8_encode($text);
?>

dieses Scriptchen eben ohne den Content-Type-Header benutzt habe, und dann mit
http://web-sniffer.net/?url=
aufgerufen habe, kam nur Müll in der Browseranzeige an. Charset war ISO-8859-1. Genauso hatte ich es auch erwartet.

Mit dem Header hat der Browser auch artig gezeigt, was er sollte und der Web-Sniffer hat auch brav den passenden Header angezeigt (*logisch*).

Reicht es, das charset im Header zu setzen?

Scheint also der richtige Weg zu sein.
Alternativ könnte man natürlich den VirtHost entsprechend konfigurieren.

Wer hat Vorrang? Der HTTP-Header oder das Meta-Äquivalent?
Das sollte dir doch eigentlich bekannt sein: HTTP-Header hat Vorrang vor Meta-Angabe.

Danke. Ich probiers aber trotzdem nochmal selber aus. Darum heiße ich ja Thomas *g*

reicht es, alle Ausgaben, die PHP produziert mit utf8_encode
http://de.php.net/manual/en/function.utf8-encode.php
zu behandeln?

Das kann man so pauschal nicht sagen, denn deine Strings könnten ja bereits UTF-8-codiert sein - ein Encoding wäre also falsch.

Das ist jetzt der spannende Teil.
Im ersten Moment habe ich gedacht: Nö, der Sven spinnt...
Aber leider spinnt der nicht, sondern mein Problem ist größer, als ursprünglich angenommen:

Wenn ich mit Templates arbeite, und mich überall auf ASCII beschränke, dann kann ich die
  abspeichern in was ich will (UTF-8 oder ANSI, ...). Das Bitmuster siehr überall genauso
  aus.

Wenn ich nun von PHP die Platzhalter ersetzen lasse, muss ich wissen, in welcher Codierung
  die in der Datenbasis stehen. Um dort sinnvoll sortieren zu können, sollte die DB wissen,
  dass sie nun utf-8 enthält, oder?

Beim Arbeiten mit Flatfiles müsste es doch egal sein. Nur wie bekomme ich Türkische Zeichen
  in mein Textpad? Woher weiß mein Editor auf einem deutschen Computer, dass er den Zeichen-
  Quellcode nun plötzlich als Türksiche Zeichen interpretieren soll zum Konvertieren in utf-8
  und Wegschreiben ins Flatfile?

Was passiert mit den Zeichen, die schon mit HTML-Entitäten codiert sind?
Dürfen die drin stehenbleiben?

Entities werden aus Zeichen gebildet, die sich auch mit ASCII darstellen ließen, mithin also in UTF-8 den Bereich >= 0x7F einnehmen.
Man darf sie natürlich mit utf8_encode behandelt, das wird sie aber nicht verändern.

Klar. Ergibt sich aus den anderen Überlegungen...

Ist die Codierung dann trotzdem noch eindeutig?
Welche Frage verbirgt sich hier?

Wie könnte ich es hinbekommen, innerhalb _einer_ PHP-Quelldatei Ausgabefunktionen sowohl für Deutschen Text, als auch für Türkisch und 'Alienesisch' zu erfassen?

Darf ich die Alien-Zeichen dann alle mittels "Einfügen Sonderzeichen" anreihen? Gibts Editoren, die während der Arbeit (ohne die Datei schließen zu müssen) das Umschalten des Zeichensatzes erlauben?

Schön wäre dann natürlich auch das Umschalten der Tastatur. Gibt es Tastaturumschalter, die den Betrieb von _mehreren_ Tastaturen an _einem_ PC ermöglichen?

Alternativ muss man die Inhalte sonst eben wirklich _alle_ auslagern.

Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau