Connie: Zeichensatz - Problem

Hallo,

ich habe ein leidiges Problem: eine Datei mit russischem Zeichensatz wird auf einem Server richtig, auf einem anderen Server falsch angezeigt, der Zeichensatz wird nicht erkannt.

der HEader der Datei:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">

auch andere kyrillische Zeichensätze verhielten sich identisch.
Ich habe beide Seiten mit mehreren Browsern aufgesucht, immer gleiches Ergebnis.
Also muss es wohl an der Serverkonfiguration liegen, und da weiß ich
nicht,wo ich drehen kann...

richtig: http://www.terterian.org/uml/

falsch: http://www.zweiterblick.de/zweiterblick/index.html

habt Ihr einen Rat? Dann könnte ich mich getrost auf mein Rasenbett zurückziehen;=)

Connie

  1. Hallo,

    ein richtiger "Russen-Tag" heute;-)

    <meta http-equiv="content-type" content="text/html; charset=windows-1251">

    Vergiss META.
    Den Zeichensatz gibt man per HTTP an. META ist eine Kruecke.

    Also muss es wohl an der Serverkonfiguration liegen, und da weiß ich
    nicht,wo ich drehen kann...

    Dein Verdacht ist richtig.
    http://cgi.w3.org/cgi-bin/headers sagt mir, dass
    die Server die Dateien wie folgt ausliefern:

    richtig: http://www.terterian.org/uml/

    Content-Type: text/html
    => also keine Angabe zum Charset im HTTP-Header;
    folglich schauen die Browser wohl doch ins META-Tag.

    falsch: http://www.zweiterblick.de/zweiterblick/index.html

    Content-Type: text/html; charset=iso-8859-1
    => diese Angabe im HTTP-Head wird von den Browsern staerker gewichtet
       als die META-Kruecke.

    habt Ihr einen Rat? Dann könnte ich mich getrost auf mein Rasenbett zurückziehen;=)

    Versuche, den Server so zu konfigurieren, dass er das
    richtige Charset angibt. Das geht wahrscheinlich nur
    auf einer "per-directory" Basis, also fuer ein ganzes
    Verzeichnis auf einmal.

    Beim Apachen legt man dafuer eine .htaccess-Datei ins Verzeichnis,
    mit folgendem Inhalt:

    AddDefaultCharset iso-8859-1

    Auch andere Varianten sind mit .htaccess moeglich.
    Voraussetzung ist, dass Dein Webhost ueberhaupt
    die Konfiguration mittels .htaccess zulaesst.

    HTH, mfg + do swidanja

    Thomas

    1. Hallo nochmal,

      Sorry, kleiner Fehler:

      AddDefaultCharset iso-8859-1

      Sollte natuerlich heissen:
      AddDefaultCharset windows-1251

      Besser waere wohl das entsprechende iso-8859-X.

      mfg
      Thomas

    2. Hallo,

      ein richtiger "Russen-Tag" heute;-)

      da, eta pravda...

      <meta http-equiv="content-type" content="text/html; charset=windows-1251">

      Vergiss META.
      Den Zeichensatz gibt man per HTTP an. META ist eine Kruecke.

      ja, aber geht manchmal eben nicht anders

      Das geht wahrscheinlich nur  auf einer "per-directory" Basis,

      tja, und also habe ich ein Problem. Der Server gehört mir natürlich gar nicht, ich kann also nur selbst mit der .htaccess-Datei das Verzeichnisweise regeln und dafür muss ich das ganze Projekt auseinanderbauen... ist dort nämlich in deutsch, russisch, französisch und englisch vorhanden (die Reise nach Petuschki z.B.)

      Auch andere Varianten sind mit .htaccess moeglich.
      Voraussetzung ist, dass Dein Webhost ueberhaupt
      die Konfiguration mittels .htaccess zulaesst.

      ja das tut er, oder wird er müssen ;=(

      HTH, mfg + do swidanja

      poka,
      Connie

      1. Hi Connie,

        tja, und also habe ich ein Problem. Der Server gehört mir natürlich gar nicht, ich kann also nur selbst mit der .htaccess-Datei das Verzeichnisweise regeln und dafür muss ich das ganze Projekt auseinanderbauen... ist dort nämlich in deutsch, russisch, französisch und englisch vorhanden (die Reise nach Petuschki z.B.)

        kannst Du die jeweilige Sprachvariante durch ein Muster des Dateinamens erkennen? (Würde sich ja anbieten, entsprechende Endungen zu verwenden und dann Content Negotiation zu machen.)

        Du kannst innerhalb von .htaccess Direktiven wie
           http://httpd.apache.org/docs/mod/core.html#filesmatch
        verwenden - und damit die Kodierung für jede Sprache individuell setzen.

        Viele Grüße
              Michael

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
         => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
        Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
        1. kannst Du die jeweilige Sprachvariante durch ein Muster des Dateinamens erkennen? (Würde sich ja anbieten, entsprechende Endungen zu verwenden und dann Content Negotiation zu machen.)

          das reizt mich, *.rhtml = russich, *.ehtml = englisch, *.fhtml = französisch, *.dhtml = deutsch

          das ist gut, aber was passiert, wenn ich PHP-Dateien einsetze?

          dann werde ich doch verzeichnisweise arbeiten müssen oder ich schalte AddDefaultCharSet Off und alles wird aus den META-Direktiven im Header genommen?

          Gruss,
          Connie

          1. Hallo Connie,

            das ist gut, aber was passiert, wenn ich PHP-Dateien einsetze?

            Dann kannst Du am Anfang dieser PHP-Dateien mit

            Header ('Content-Type: text/html; charset=...');

            die Zeichenkodierung auch selbst festlegen, _ohne_ in die Apache-Konfiguration zu müssen. (Genaugenommen hat die Apache-Konfiguration in dieser Hinsicht bei CGI-Scripten keinen Effekt, weil diese ihre Content-Type-Header alle selbst erzeugen; PHP macht das im Normalfall automatisch (und sendet einfach nur 'text/html'), Du kannst aber auch selbst so eine Angabe machen)

            Viele Grüße,
            Christian

            1. Danke!
              Ich werde mir das genauer ansehen und dann startet das große Aufräumen;=)

          2. Hi Connie,

            das reizt mich, *.rhtml = russich, *.ehtml = englisch, *.fhtml = französisch, *.dhtml = deutsch

            nein - natürlich nicht so. Dann müßtest Du ja die Links für jede Sprache unterschiedlich setzen.

            Statt dessen: russisch = *.html.ru, deutsch = *.html.de, französisch = *.html.fr, und die Default-Sprache Deiner Wahl = *.html.html.
            Deine Links setzt Du trotzdem nur auf *.html! Welche Datei dadurch adressiert wird, das herauszufinden macht eben Apaches mod_negotiation für Dich, anhand der vom Browser übermittelten Sprache.

            Irgendjemand hat unter
               http://aktuell.de.selfhtml.org/artikel/server/alt-http/
            auch so einen komischen Artikel zu diesem Thema geschrieben ...

            das ist gut, aber was passiert, wenn ich PHP-Dateien einsetze?

            Dasselbe. Entscheidend ist die Differenz zwischen dem verlinkten und dem tatsächlich existierenden Dateinamen - das ist die "Verhandlungmasse". (Die übrigens sogar aus mehreren "Dimensionen" bestehen darf - "Sprache" ist keineswegs die einzig mögliche.)

            dann werde ich doch verzeichnisweise arbeiten müssen oder ich schalte AddDefaultCharSet Off und alles wird aus den META-Direktiven im Header genommen?

            Meiner Meinung nach funktioniert die Auswertung von HTTP-Headern zuverlässiger als diejenige von <meta>-Tags. Deshalb würde ich davon Abstand halten, dieselbe Information an zwei Stellen (und womöglich auch noch widersprüchlich) auszuliefern. Du mußt Dir dann halt bewußt sein, daß Deine .htaccess-Dateien elementarer Bestandteil Deines Content geworden sind ...

            Viele Grüße
                  Michael

            --
            T'Pol: I apologize if I acted inappropriately.
            V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
            (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
             => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
            Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
            1. Hallo Michael,

              das ist gut, aber was passiert, wenn ich PHP-Dateien einsetze?

              Dasselbe.

              Wenn es um Content Negotiation im Sinne von 'aus unterschiedlichen Dateien auswählen' geht, gebe ich Dir Recht. Da es hier allerdings um den Content-Type-Header geht, muss ich Dir widersprechen. Denn PHP sendet automatisch ein Content-Type: text/html (bzw. etwas anderes, was in der php.ini eingestellt ist) und überschreibt somit jegliche Art von Header, die der Apache vorher sich vorgemerkt haben könnte. (was der Apache hier aber vermutlich auch nicht tut, da der Content-Type application/x-httpd-php beim Apache entweder den PHP-CGI-Handler auslöst oder vom PHP-Modul abgefangen wird (je nach Art der Konfiguration))

              Viele Grüße,
              Christian

              1. Hallo Christian,

                Denn PHP sendet automatisch ein Content-Type: text/html (bzw. etwas anderes, was in der php.ini eingestellt ist) und überschreibt somit jegliche Art von Header, die der Apache vorher sich vorgemerkt haben könnte.

                ich denke, es funktioniert anders herum: Apache fängt den PHP-Output auf und _ergänzt_ fehlende Header. Mit mod_headers müßte man die PHP-Ausgabe mit Gewalt überschreiben können.

                Viele Grüße
                      Michael

                --
                T'Pol: I apologize if I acted inappropriately.
                V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
                (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
                 => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
                Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
            2. Statt dessen: russisch = *.html.ru, deutsch = *.html.de, französisch = *.html.fr, und die Default-Sprache Deiner Wahl = *.html.html.

              ach herrjemine... Michael danke, jetzt habe ich genug zu kauen und muss mir nur noch die Zeit suchen zum ausprobieren

              es ist doch immer wieder faszinierend für mich, wie man immerfort auf neue Themen stößt, die man schon mal gehört hat, die aber nun plötzlich ganz wichtig werden...

              danke und Gruss,
              Connie

              als kleiner Gruß ein Schild, das ich heute nach dem Harley-DAvidson-Wochenende in Hamburg bei mir um die Ecke entdeckte..

              sagen wir mal, CharacterEncoding ist Mist... (bis man es richtig verstanden hat..)

              1. Hi Connie,

                sagen wir mal, CharacterEncoding ist Mist... (bis man es richtig verstanden hat..)

                abgesehen von den historischen Fehlentwicklungen (weil die Amis mit ASCII einen Standard durchgesetzt haben, der gerade bis an deren Tellerrand reicht) und den diversen Gegenmaßnahmen (HTML-Entities, URL-Encoding, Unicode usw.): Die Auswirkungen, die Du bei Character-Encoding erlebst, sind zum Teil das Ergebnis eines Zuständigkeitsproblems.

                Ein HTML-Dokument wird via HTTP transportiert; wer von beiden ist zuständig für die Beschreibung der Interpretationsvorschrift für den Inhalt? Beide "Protokollschichten" versuchen es (und XML versucht es ebenfalls); entsprechend chaotisch ist das Ergebnis, weil man nicht nur sämtliche möglichen Mechanismen verstehen muß, sondern zu allem Überfluß auch noch, wie diverse Programme mit widersprüchlichen Informationen zurecht kommen, die aufgrund dieser Mechanismen auftreten können ...

                Würden sich alle Beteiligten darauf einigen, daß HTTP-Informationen nach HTTP gehören und nicht in die Dokumente hinein, dann gäbe es <meta http-equiv> und Ähnliches gar nicht. Aber dann würde man sich bei der Verwendung von HTML (und XML) auf den Transport via HTTP festlegen!
                Das wiederum ist gerade angesichts der vielfältigen Möglichkeiten von XML auch nicht erwünscht ... und was tut man, wenn jemand ein HTML-Dokument als attachment einer Mail versendet, wobei die HTTP-Header der Original-Auslieferung ggf. verloren gehen?

                Fragen über Fragen ...

                Viele Grüße
                      Michael

                --
                T'Pol: I apologize if I acted inappropriately.
                V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
                (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
                 => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
                Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
                1. Michael,

                  sagen wir mal, CharacterEncoding ist Mist... (bis man es richtig verstanden hat..)

                  genau;=(

                  Fragen über Fragen ...

                  nun, mein Problem ist erstmal gelöst:

                  alle Dateien haben eine aktuelle Doctype-Angabe
                  alle Dateien enthalten keine content-type-Angaben mehr
                  alle Dateien sind in Unicode gespeichert
                  im Verzeichnis ist eine .htaccess mit der Direktive "AddDefaultCharset utf-8" und alle Browser, die auf "automatische Zeichensatzerkennung" konfiguriert sind, zeigen nun UNICODE (wenn sie denn Unicode darstellen können..)

                  nun denke ich, habe ich wieder lesbare Seiten und werde nach und nach alle Arbeiten, die mehrsprachig vorliegen, in UNICODE umsetzen und dann is Ruhe im Karton

                  ich danke dir,
                  Connie

      2. Dobri viedscher,

        Ich versuche, noch ein paar Ideen als Ergaenzung zu Michaels
        Posting zu liefern.

        [Apache: HTTP-Charset-Header mittels .htaccess festlegen]
        Das geht wahrscheinlich nur  auf einer "per-directory" Basis,

        tja, und also habe ich ein Problem. Der Server gehört mir natürlich gar nicht, ich kann also nur selbst mit der .htaccess-Datei das Verzeichnisweise regeln und dafür muss ich das ganze Projekt auseinanderbauen... ist dort nämlich in deutsch, russisch, französisch und englisch vorhanden (die Reise nach Petuschki z.B.)

        OK, ich sehe Dein Problem.
        Wie viele russische Dateien hast Du denn? (=> Aufwand-Abschaetzung)
        (Fuer die andern sollte ja ISO-8859-1 ausreichen, also kannst Du
        sie auf jeden Fall in einem Verzeichnis lassen.)

        Wenn Du die Dateien nicht in verschiedene Verzeichnisse
        verteilen willst, kannst Du vielleicht einen Trick mit
        "speziellen" Datei-Endigungen versuchen.
        Dann kannst Du dieser speziellen Endigung das Charset zuordnen.
        Z.B. reise.html.ru
        Je nach Konfiguration zeigt der Server die Datei auch an,
        wenn der Browser nur reise.html verlangt und es die einzige
        Datei reise.html* ist.

        Das ganze hat mit Content Negotiation und Multiviews zu tun:
        http://httpd.apache.org/docs/content-negotiation.html

        Ich habe es selbst noch nie angewendet; der folgende Vorschlag
        fuer eine .htaccess ist frei erfunden:

        ----------------

        Multiviews fuer dieses Verzeichnis einschalten:

        (muss vom Webmaster _ausdruecklich_ erlaubt sein, siehe Doku.)

        Options +MultiViews

        Grundsaetzlich sollen alle (Text-)Dateien mit ISO-8859-1

        ausgeliefert werden:

        AddDefaultCharset iso-8859-1

        Ausnahme: Dateien mit .ru kriegen das russische Charset:

        AddCharset WINDOWS-1251 .ru

        Optional: Dateien mit .ru kriegen die Sprache Russisch:

        AddLanguage ru .ru
        ----------------

        Falls das mit der Endigung .html.ru nicht hinhaut, koenntest Du
        einen noch billigeren Trick nehmen:
        .html fuer Dateien in Englisch, Deutsch u.s.w.
        .htm  fuer Dateien in Russisch
        Braucht einfach etwas mehr Disziplin beim Linksetzen u.s.w.

        Die .htaccess wuerde dann so aussehen:
        ----------------
        AddDefaultCharset iso-8859-1
        AddCharset WINDOWS-1251 .htm

        Vielleicht zur Sicherheit nochmal:

        AddCharset iso-8859-1 .html
        ----------------

        Oder Du definierst gleich eine Fantasie-Endigung
        fuer die russischen Dateien, z.B. .rhtml
        Die .htaccess wuerde dann zu:
        ----------------
        AddDefaultCharset iso-8859-1
        AddType    text/html    .rhtml
        AddCharset WINDOWS-1251 .rhtml
        ----------------

        Zum Thema "Webhoster und MultiViews": Vergleiche auch den Thread:
        http://forum.de.selfhtml.org/archiv/2002/3/5959/
        Zum Thema "Content Negotiation/MultiViews" siehe auch:
        http://selfhtml.teamone.de/diverses/htaccess.htm#alternative_inhalte
        http://www.bowiesnyder.com/writings/nls_apache.htm

        So, jetzt hast Du mal was zum kauen und ausprobieren!

        mfg + viel Glueck!
        Thomas

        1. Hi Thomas,

          Dobri viedscher,

          Ne, du verwechselst da was. Ein "viedscher" ist im sächsischen Sprachraum so etwas wie ein Merkmal, der Angelsachse nennt es auch "feature". Du meinst aber sicher "wjetscher".

          *SCNR*

          Viele Grüße
          Torsten

        2. privet Thomas,

          So, jetzt hast Du mal was zum kauen und ausprobieren!

          ja, das habe ich
          ich werde mir am Wochenende Zeit nehmen und das alles ausprobieren
          es ist interessant, in neue Gebiete vorzustoßen, bis jetzt habe ich mich immer um die Apache-Konfiguration drücken können und die Handbücher stehen eher als "eherne Reserve" im Regal

          danke für die vielen Anregungen
          das mit den verschiedenen Endungen hatte ich irgendwie im Hinterkopf, ich glaube, das versuche ich

          spasibo,

          Connie