jaycop: Unicode UTF-16LE Darstellungsprobleme

Hi,

hab grad Schwierigkeiten eine UTF-16LE kodierte Page im Browser darstellen zu lassen. Im Moment wird gar nichts dargestellt, so als ob die charset Eigenschaften nicht stimmen würden.

Das ist die Testpage:

  
<?xml version="1.0" encoding="UTF-16LE"?>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<title>Beschreibung der Seite</title>  
</head>  
<body>  
  
</body>  
</html>  

Und der dazugehörige Hex-Byte-Stream, den ich mir mit Wireshark anschauen kann, sieht entsprechend so aus:

  
48005400540050002f0031002e003000200032003000300020004f004b000d000a0043006f006e00740065006e0074002d004c0065006e006700740068003a0020003500390036000d000a0043006f006e00740065006e0074002d0054007900700065003a00200074006500780074002f00680074006d006c003b00200063006800610072007300650074003d005500540046002d00310036004c0045000d000a000d000a003c003f0078006d006c002000760065007200730069006f006e003d00220031002e0030002200200065006e0063006f00640069006e0067003d0022005500540046002d00310036004c00450022003f003e000d000a003c00210044004f00430054005900500045002000680074006d006c0020005000550042004c0049004300200022002d002f002f005700330043002f002f0044005400440020005800480054004d004c00200031002e00300020005400720061006e0073006900740069006f006e0061006c002f002f0045004e0022000d000a002000200020002000220068007400740070003a002f002f007700770077002e00770033002e006f00720067002f00540052002f007800680074006d006c0031002f004400540044002f007800680074006d006c0031002d007400720061006e0073006900740069006f006e0061006c002e0064007400640022003e000d000a003c00680074006d006c00200078006d006c006e0073003d00220068007400740070003a002f002f007700770077002e00770033002e006f00720067002f0031003900390039002f007800680074006d006c0022003e000d000a003c0068006500610064003e000d000a003c007400690074006c0065003e0042006500730063006800720065006900620075006e00670020006400650072002000530065006900740065003c002f007400690074006c0065003e000d000a003c002f0068006500610064003e000d000a003c0062006f00640079003e000d000a000d000a003c002f0062006f00640079003e000d000a003c002f00680074006d006c003e00  

Als Header hab ich bei meiner Response, folgende hinzugefügt:

  • Http/1.1 200 OK
  • Content-Length
  • Content-Type: text/html (oder text/html; charset=UTF-16LE)
  • \r\n
  • und die Daten

Weiß jmd Rat - was mache ich falsch?!?

Gruß
Jaycop

  1. Hallo,

    hab grad Schwierigkeiten eine UTF-16LE kodierte Page im Browser darstellen zu lassen. Im Moment wird gar nichts dargestellt, so als ob die charset Eigenschaften nicht stimmen würden.

    kann man sich das irgendwo live ansehen?

    <?xml version="1.0" encoding="UTF-16LE"?>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Beschreibung der Seite</title>
    </head>
    <body>

    </body>
    </html>

      
    Sieht zumindest korrekt aus; die XML-Deklaration schickt aber zumindest ältere IEs in den Quirks Mode. Wenn du das Dokument eh als text/html auslieferst und im HTTP-Header die richtige Angabe zur Zeichencodierung steht, kannst du sie auch weglassen.  
      
    
    > Und der dazugehörige Hex-Byte-Stream, den ich mir mit Wireshark anschauen kann, sieht entsprechend so aus:  
    > [code lang=php]  
      
    Wie kommst du auf die Idee, das hier im Forum als PHP-Code auszuzeichnen?  
      
    
    > 48005400540050002f0031002e003000200032003000300020004f004b000d000a0043006f006e007400...  
      
    "HTTP/1.0 200 OK\r\n  
     Cont..."  
      
    Da ist aber irgendwas \*gewaltig\* schiefgelaufen, wenn sogar der Header schon UTF-16 codiert ist. Der HTTP-Header sollte in ganz "normalem" ASCII daherkommen.  
      
    
    > Weiß jmd Rat - was mache ich falsch?!?  
      
    Das weiß ich nicht, da du uns nicht zeigst, was du machst - nur das Resultat davon.  
    Und das ist \*sehr\* eigenartig.  
      
    So long,  
     Martin  
    
    -- 
    Arzt:    Gegen Ihr Übergewicht hilft wohl nur noch Gymnastik.  
    Patient: Sie meinen, Kniebeugen und so?  
    Arzt:    Nein, Kopfschütteln. Immer dann, wenn Ihnen jemand was zu essen anbietet.  
      
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hallo,

      vielen Dank für deine Antwort.

      Hallo,

      hab grad Schwierigkeiten eine UTF-16LE kodierte Page im Browser darstellen zu lassen. Im Moment wird gar nichts dargestellt, so als ob die charset Eigenschaften nicht stimmen würden.

      kann man sich das irgendwo live ansehen?

      leider im Moment nicht. Ich arbeite mit Microsoft Visual Studio und programmiere den Webserver in C++ Unicode. Unicode wird hier als UTF-16LE dargestellt; d.h. auch der komplette Http-Header wird in diesem Format erzeugt.

      Wenn ich dich richtig verstanden habe, dann muss der Http-Header aber in jedem Fall in reinem ASCII-Code vorliegend sein? Also im 8Bit-Modus? Damit ein Web-Browser überhaupt die Chance hat diesen zu verstehen?

      Also statt "0x48005400540050002f00" muss es "0x485454502f" lauten...

      <?xml version="1.0" encoding="UTF-16LE"?>

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
      <title>Beschreibung der Seite</title>
      </head>
      <body>

      </body>
      </html>

      
      >   
      > Sieht zumindest korrekt aus; die XML-Deklaration schickt aber zumindest ältere IEs in den Quirks Mode. Wenn du das Dokument eh als text/html auslieferst und im HTTP-Header die richtige Angabe zur Zeichencodierung steht, kannst du sie auch weglassen.  
        
      Soweit ich das gelesen habe, wird die Information hier nur dann ausgewertet, wenn kein Content-Type Header mitgeschickt worden ist bzw. nicht die volle Information beinhaltet.  
        
      Ist eine HTML-Version4-Deklaration sinnvoller (damit keine Browser durcheinander kommen)?  
        
        
      Gruß  
      Jaycop  
      
      1. Mahlzeit,

        Ich arbeite mit Microsoft Visual Studio und programmiere den Webserver in C++ Unicode.

        oh, Respekt.

        Unicode wird hier als UTF-16LE dargestellt

        Windows-typisch eben ...

        d.h. auch der komplette Http-Header wird in diesem Format erzeugt.

        Und genau das darf nicht sein.

        Wenn ich dich richtig verstanden habe, dann muss der Http-Header aber in jedem Fall in reinem ASCII-Code vorliegend sein? Also im 8Bit-Modus? Damit ein Web-Browser überhaupt die Chance hat diesen zu verstehen?

        Genau.

        Also statt "0x48005400540050002f00" muss es "0x485454502f" lauten...

        Genau. :-)

        die XML-Deklaration schickt aber zumindest ältere IEs in den Quirks Mode. Wenn du das Dokument eh als text/html auslieferst und im HTTP-Header die richtige Angabe zur Zeichencodierung steht, kannst du sie auch weglassen.
        Soweit ich das gelesen habe, wird die Information hier nur dann ausgewertet, wenn kein Content-Type Header mitgeschickt worden ist bzw. nicht die volle Information beinhaltet.

        Nein, hier verwechselst du etwas.
        Ein Content-Type-Header muss bei einer HTTP-Antwort immer sein - allerdings muss er nicht zwingend eine charset-Angabe haben. Wenn die fehlt, wird ein Browser nach einem gleichnamigen meta-Element im Dokument suchen, wenn er HTML "spricht" (das ist der übliche Fall). Die XML-Deklaration am Anfang wird in diesem Modus sowieso ignoriert, verhindert aber im IE6 (und IE7?) den "Fast-Standard"-Mode.
        Ein XHTML-Dokument kann aber auch als application/xml+xhtml anstatt text/html ausgeliefert werden. Das hat zur Folge, dass ältere IEs nichts mehr damit anfangen können, moderne Browser das Dokument aber tatsächlich nach XML-Regeln verarbeiten. *Dann* ist auch die XML-Deklaration sinnvoll, vor allem wenn man eine andere Zeichencodierung als UTF-8 verwendet.

        Ist eine HTML-Version4-Deklaration sinnvoller (damit keine Browser durcheinander kommen)?

        Das kannst du halten wie du magst. Ob HTML oder XHTML ist weitgehend Geschmackssache, und solange du das Dokument HTML-kompatibel als text/html auslieferst, sind die Unterschiede in der Praxis kaum relevant - es sei denn, du als Autor profitierst von der XML-Konformität eines Dokuments.

        Ciao,
         Martin

        --
        "So schnell waren wir noch nie am Unfallort", sagte der Polizist zu seinem Kollegen, als er einen Laternenmast gerammt hatte.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. @@Der Martin:

          nuqneH

          verhindert aber im IE6 (und IE7?) den "Fast-Standard"-Mode.

          IE 6 ja, IE 7 nein. Eine XML-Deklaration schaltet IE 7 nicht in den Quirksmodus.

          *Dann* ist auch die XML-Deklaration sinnvoll, vor allem wenn man eine andere Zeichencodierung als UTF-8 verwendet.

          Auch bei UTF-16 ist keine Angabe der Zeichencodierung notwendig.

          „Bei Abwesenheit einer externen Information über die Zeichenkodierung (wie zum Beispiel MIME-Kopfzeilen), müssen analysierte Entities, die in einer anderen Kodierung als UTF-8 und UTF-16 gespeichert sind, mit einer Text-Deklaration beginnen, die eine Kodierungsdeklaration enthält.“ [XML §4.3.3]

          Qapla'

          --
          Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
          (Mark Twain)
          1. Hallo Gunnar,

            verhindert aber im IE6 (und IE7?) den "Fast-Standard"-Mode.
            IE 6 ja, IE 7 nein. Eine XML-Deklaration schaltet IE 7 nicht in den Quirksmodus.

            ich meinte auch, ich hätte das mal so gelesen, war mir aber beim IE7 nicht sicher.

            *Dann* ist auch die XML-Deklaration sinnvoll, vor allem wenn man eine andere Zeichencodierung als UTF-8 verwendet.
            Auch bei UTF-16 ist keine Angabe der Zeichencodierung notwendig.

            Interessant, das wusste ich auch nicht.

            „Bei Abwesenheit einer externen Information über die Zeichenkodierung (wie zum Beispiel MIME-Kopfzeilen), müssen analysierte Entities, die in einer anderen Kodierung als UTF-8 und UTF-16 gespeichert sind, mit einer Text-Deklaration beginnen, die eine Kodierungsdeklaration enthält.“ [XML §4.3.3]

            Okay. Wer hat das übersetzt - du etwa? ... nein, da steht's ja.
            Das erste Komma im zitierten Abschnitt gehört da nämlich nicht hin.

            Ciao,
             Martin

            --
            Er:  Mit wem warst du gestern abend aus?
            Sie: Du bist mal wieder eifersüchtig wie immer!
            Er:  Wer ist Immer?
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. @@jaycop:

    nuqneH

    <?xml version="1.0" encoding="UTF-16LE"?>
    --8<--
    Und der dazugehörige Hex-Byte-Stream, den ich mir mit Wireshark anschauen kann, sieht entsprechend so aus:
    48005400[…]
    --8<--

    • Content-Type: text/html (oder text/html; charset=UTF-16LE)

    Wenn du XHTML als text/html auslieferst, ist die XML-Deklaration – und damit die Angabe der Zeichncodierung darin – wirkungslos.*

    “If your page is encoded as UTF-16, do not declare your file to be "UTF-16BE" or "UTF-16LE", use "UTF-16" only, and send a byte-order mark with your file.” [HTML-ENCODING-DECLARATIONS]

    Qapla'

    * vom Quiksmode im IE 6 mal abgesehen

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)