Biks: Problem mit Encodierung (Umlaute & Co.)

Hallo zusammen,

Intro: Ich bin ein leidenschaftlicher Anhänger der Internetdatenbank DISCOGS. Dort sind viele Schallplatten-Veröffentlichungen hinterlegt, welche man sich zu einer eigenen Sammlung zusammenstellen kann. Diese wiederum wird zum Download angeboten, welche ich nun in eine HTML-Datei via XSL umwandeln möchte.

Problembeschreibung: Die Daten werden in einer XML-Datei zur Verfügung gestellt, die keinen Header aufweist.
Sie beginnt so:

  
<releases num="407">  
 <release id="111621" status="Accepted">  
...  

Innerhalb der XML-Datei werden Umlaute bzw. Sonderzeichen so dargestellt:

  
<name>Christoph H. M&#195;&#188;ller</name>  

Ich habe nun der XML-Datei folgenden Header hinzugefügt:

  
<?xml version="1.0" encoding="UTF-8"?>  
<?xml-stylesheet type="text/xsl" href="mycollection.xsl" ?>  
  
<releases num="407">  
 <release id="111621" status="Accepted">  
...  

Und entsprechend auch meine XSL gestaltet:

  
<?xml version="1.0" encoding="utf-8"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
<xsl:output method="html" encoding="utf-8" />  
...  

Will ich die XML nun darstellen (Firefox 3.0, IE7 und XMLSpy), erscheint folgendes: Christoph H. Müller

Das gleiche passiert auch mit "ISO-8859-1"!

Frage: Warum werden die Umlaute nicht richtig dargestellt???

Viele Grüße!

Biks

  1. Moin!

    Innerhalb der XML-Datei werden Umlaute bzw. Sonderzeichen so dargestellt:

    <name>Christoph H. M&#195;&#188;ller</name>

      
    [...]  
      
    
    > Will ich die XML nun darstellen (Firefox 3.0, IE7 und XMLSpy), erscheint folgendes: Christoph H. Müller  
    >   
    > Das gleiche passiert auch mit "ISO-8859-1"!  
    >   
    > Frage: Warum werden die Umlaute nicht richtig dargestellt???  
      
    Weil deine Quelldaten fehlerhaft sind.  
      
    Im XML stehen zwei numerische Zeichenreferenzen. Numerische Zeichenreferenzen (NCR = numeric character reference) verwendet man dann, wenn man unabhängig vom Encoding besondere Zeichen außerhalb des ASCII-Bereichs (7 Bit! Also keine Umlaute etc, nur A-Z und wenige andere Satzzeichen) verwenden will.  
      
    Die in der numerischen Zeichenreferenz anzugebende Nummer ist der Unicode-Codepoint. Das wird hier aber nicht gemacht. Hier wird das "ü" nicht durch eine NCR codiert, sondern durch zwei. Nämlich genau die zwei, die die Bytes darstellen, die entstehen, wenn man ein "ü" als UTF-8 codiert.  
      
    Sprich: Du kriegst aus deiner Datenquelle die UTF-8-Bytes des "ü", aber kein eigentliches "ü", sondern stattdessen die zwei Zeichen "A-Tilde" und "ein-viertel", und alle deine nachfolgenden Tools beachten treu und brav diese Angaben und sorgen dafür, dass "A-Tilde ein-viertel" auch am Ende rauskommen.  
      
    Es gibt folglich zwei Möglichkeiten, das Problem anzupacken: Die korrekte Vorgehensweise wäre, die Quelle zu korrigieren. Also bei DISCOGS anzuklopfen und das Problem anzusprechen, in der Hoffnung, dass die es korrigieren können. Dann bräuchtest du selbst nichts zu ändern.  
      
    Die andere Methode wäre, die fehlerhaften Codierungen, die dir auffallen, "manuell" (also in einer Programmroutine) durch Suchen/Ersetzen durch die korrekten Umlaute zu ersetzen. Das Problem dabei: Die Wahrscheinlichkeit, dass tatsächlich mal irgendein Name zu Recht "A-Tilde ein-viertel" enthält, ist ja nicht Null, sondern vorhanden - und würde dann fälschlich zum "ü". Dieses Risiko würde nur verschwinden, wenn die Quelle korrekt arbeiten würde - weshalb das eben die korrekte Vorgehensweise ist, deine manuelle Korrektur nur ein Hilfskonstrukt.  
      
     - Sven Rautenberg
    
    -- 
    "Love your nation - respect the others."
    
    1. Hallo Sven,

      mit dieser Antwort hast Du mir sehr geholfen!

      Vielen Dank!