XML-Datei CP1252 einlesen, Problem mit € Zeichen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML-Datei CP1252 einlesen, Problem mit € Zeichen

    Hallo,

    ich habe eine XML-Datei welche ich per Download lokal auf den Server hole.
    Diese Datei ist CP1252 encoded und enthält XML-Daten mit Umlauten und u.a. auch € Zeichen. Die XML-Datei auszulesen ist soweit kein Problem, leider habe ich ein Problem an das € Zeichen zu kommen.
    Die XML-Daten sollen auf einer Internetseite dargestellt werden welche ein UTF-8 encoding hat. Komischerweise funktionieren die Umlaute problemlos nur das € Zeichen läßt sich nicht darstellen.

    Folgende Vorgehensweise habe ich in meinem PHP-Script:
    $xmlStr = file_get_contents($xmlUrl); // Datei einlesen
    $xmlObj = simplexml_load_string($xmlStr, null, LIBXML_NOCDATA); // Daten als STRING laden und CDATA ignorieren
    $arrXml = objectsIntoArray($xmlObj); // eigene Funktion die die Daten von XML in ein mehrdimensionales Array wandelt

    Ich habe auch schon "iconv" und "recode_string" usw durchprobiert, leider alles ohne Erfolg.

    Hat jemand einen Ansatzpunkt für mich?

    Danke schonmal
    cal

  • #2
    Diese Datei ist CP1252 encoded
    Wer tut denn auch so was....

    1. ist diese CP ein propitäres Win Gedöns
    2. ist diese CP älter als das € Zeichen
    latin 1 kennt kein €
    Von daher wundert es mich nicht, dass sich PHP da etwas schwer tut.



    Folgende Zeichen im Bereich der oberen Steuerzeichen 0x80 = € (U20AC) [ ₠ ] (128) - 0x9F (159) sind auf real existierenden Maschinen evtl. nicht als solche dargestellt / darstellbar
    Aus: Zeichentabelle CP1252 (Win Latin 1)
    Wir werden alle sterben

    Kommentar


    • #3
      seltsamerweise hab ich das € Zeichen aber in der XML-Datei und per Browser ist das Ganze "normal" dargestellt.

      Ich blicks grad überhaupt nicht mehr

      Kommentar


      • #4
        Hallo,

        die MBString-Funktionen unterstützen sowohl Win1252 als auch UTF-8. Die kannst du zum Konvertieren benutzen.

        Gruß,

        Amica
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Moin Moin,

          mb_... hab ich auch schon alles probiert - langsam zweifel ich echt an mir.
          Ich hab rausgefunden, dass die Funktion "get_object_vars" anscheinend was damit zu tun hat. Wenn ich hier das encoding checke bekomme ich "ASCII" dummerweise läßt sich das nicht auf UTF-8 konvertieren.

          Ich poste hier mal die Funktion die mir aus dem XML ein Array macht:
          PHP-Code:
          function objectsIntoArray($arrObjData$arrSkipIndices = array())
          {
              
          $arrData = array();
             
              
          // if input is object, convert into array
              
          if (is_object($arrObjData)) {
                  
          $arrObjData get_object_vars($arrObjData);
              }
             
              if (
          is_array($arrObjData)) {
                  foreach (
          $arrObjData as $index => $value) {
                          if (
          is_object($value) || is_array($value)) {
                              
          $value objectsIntoArray($value$arrSkipIndices); // recursive call
                          
          }
                          if (
          in_array($index$arrSkipIndices)) {
                              continue;
                          }
                          
          $arrData[$index] = $value;
                  }
              }
              return 
          $arrData;

          Die XML wird ganz normal eingelesen:

          PHP-Code:
          $xmlStr file_get_contents($datafile);
          $xmlObj simplexml_load_string($xmlStrnullLIBXML_NOCDATA);
          $arrXml objectsIntoArray($xmlObj); 
          Und dann läuft eine Schleife darüber und ließt die Inhalte aus:

          PHP-Code:
          for($x 0$x count($arrXml['product']); $x++) {
              if(
          $arrXml['product'][$x]['@attributes']['hot'] > OR
               (
          $arrXml['product'][$x]['@attributes']['hot'] < 11 AND 
               
          $arrXml['product'][$x]['@attributes']['hot'] != 0)) {

                  
          // $angebotArr[] = $arrXml['product'][$x];
                  
                  
          if($x == 0) {
                      
          $ausgabe .= '<tr>';
                      
          $ausgabe .= '<td valign="top">';
                  } else {
                      
          $ausgabe .= '<td valign="top">';
                  }
                  
                  
          $ausgabe .= '<a href="'.$arrXml['product'][$x]['deeplink']['@attributes']['path'].'" target="_top">';
                  
          $ausgabe .= $arrXml['product'][$x]['title'].'</a><br>';
                  
          $ausgabe .= '<a href="'.$arrXml['product'][$x]['deeplink']['@attributes']['path'].'" target="_top">
              <img src="'
          .$arrXml['product'][$x]['image']['@attributes']['path'].'" border="0">
              </a><br>'
          .$arrXml['product'][$x]['description'].'<br><hr>';
                  
                  if(
          $x == 0) {
                      
          $ausgabe .= '</td>';
                  } else {
                      
          $ausgabe .= '</td>';
                      
          $ausgabe .= '</tr>';
                  }
                  
              }
          }

          $ausgabe .= '</table>';
          echo 
          $ausgabe
          Zuletzt geändert von calcaneus; 14.10.2010, 10:54.

          Kommentar


          • #6
            Bitte brich den Quellcode um!
            Bitte Beachten.
            Foren-Regeln
            Danke

            Kommentar


            • #7
              Hier die Lösung:
              PHP-Code:
              function utf8_array_decode($input)
              {
                  
              $return = array();

                  foreach (
              $input as $key => $val)
                  {
                      if( 
              is_array($val) )
                      {
                          
              $return[$key] = utf8_array_decode($val);
                      }
                      else
                      {
                          
              $return[$key] = utf8_decode($val);
                      }
                  }
                  return 
              $return;          

              Kommentar


              • #8
                Wundert mich jetzt, dass das schon reicht. utf8_decode gibt dir doch eine Latin-1-Zeichenkette zurück. Ich hatte dich aber so verstanden, dass du CP1252 hast/brauchst. Die beiden sind sich zwar sehr ähnlich aber nicht gleich.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar

                Lädt...
                X