Google Base API, Probleme beim Encoding

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

  • Google Base API, Probleme beim Encoding

    Hallo,

    ich stehe vor folgendem Problem.

    Für meinen Webshop habe ich eine Schnittstelle zur Google Base API geschrieben, welche auch einwandfrei funktioniert.

    Bei manchen Artikeln scheinen aber soviele Sonderzeichen bzw. sonstige HTML Formatierungen drin zu sein, dass ich folgende Fehlermeldung bekomme:

    Code:
    <error type="data" field="description" reason="There is a problem with the character encoding of this attribute." /> </errors>
    Ich habe versucht mit folgendem Code eigentlich die Beschreibung so gut wie von allem zu befreien und als UTF-8 zu übertragen, aber anscheinend bleiben halt bei einigen Artikeln Rückstände zurück:

    PHP-Code:
        $tags '<p><a><br><br /><table><tr><td><ul><ol><li><img><center><h1><h2><h3><div>'
        
    $content utf8_encode(    
                
    html_entity_decode(    
                    
    str_replace('&nbsp;'''
                        
    strip_tags(
                            
    preg_replace('/\<(i|p|span|font)\s.*?\>/im''<\1>'
                                
    stripslashes($products_array[$i]['products_description']
                                    )
                                ), 
                            
    $tags)
                        )
                    )
                ); 
    Hat jemand noch eine Idee wie ich den String bis auf den eigentlichen Text bereinigen kann?

    Leider bekomme ich von der Google API keine konkrete Fehlerbeschreibung, um welches Zeichen es sich konkret handelt, was er bemängelt.

    Zusammenfassend ist zu sagen, dass ich einen UFT-8 validen String brauche.

    Oder hat auch jemand eine Idee wo man einen String auf UTF-8 Validität prüfen kann?

    Vielen Dank und Grüße
    Michael
    Zuletzt geändert von francosdad; 04.07.2009, 17:18. Grund: gelöst

  • #2
    Hallo.

    Eigentlich sollte utf8_encode() alles passend kodieren. Bist du dir sicher, dass du die Daten auch mit einem passenden Charset im Header absendest?

    Ansonsten würde ich um konkretere Informationen bzw. ein konkretes Beispiel bitten.

    Gruß Marc

    PS: Einen String auf UTF8-Validität zu prüfen, ist nicht sonderlich schwierig. Aber dazu sollte sich was googlen lassen. Ich sehe allerdings nicht, wieso utf8_encode() nicht ausreichen sollte, um das zu gewährleisten.

    Kommentar


    • #3
      Ich sehe allerdings nicht, wieso utf8_encode() nicht ausreichen sollte, um das zu gewährleisten.
      Ich auch nicht.

      Das Problem ist, dass die ganze API auf UTF-8 eingestellt ist, d.h. sie akzeptiert keine keine andere Codierung.

      Das ganze wird über das GDATA Framework von Zend gelöst und arbeitet mittels SOAP, soweit wie ich das erkennen kann und da kann ich eben keinen header mitsenden.

      Das ganze läuft wie folgt ab:

      PHP-Code:
          $token getToken();
          
      $client Zend_Gdata_AuthSub::getHttpClient($token);
          
      $service = new Zend_Gdata_Gbase($client);
          
          for (
      $i=0$i count($products_array); $i++) {
          print     
      $products_array[$i]['products_id']."<br />";
              
      $tags '<p><a><br><br /><table><tr><td><ul><ol><li><img><center><h1><h2><h3><div>';
          
      $content str_replace('&''&amp;'
                  
      str_replace('&bdquo;''"'
                   
      str_replace('&ndash;'''
                    
      str_replace('&euro;''EUR'
                     
      utf8_encode(
                      
      html_entity_decode(
                       
      str_replace('&nbsp;'''
                        
      strip_tags(
                         
      preg_replace('/\<(i|p|span|font)\s.*?\>/im''<\1>'
                      
      stripslashes($products_array[$i]['products_description'])
                      ), 
      $tags
                         
      )
                        )
                       )
                      )
                     )
                    )
                   )
                  );

          
      $newEntry $service->newItemEntry();

          
      // Add the title
          
      $newEntry->title $service->newTitle(utf8_encode($products_array[$i]['products_name']));
          
          
      // Add the content
          
      $newEntry->content $service->newContent($content);
          
      $newEntry->content->type 'text';   // specifying a type is recommended
          
          // Define the item type
          
      $newEntry->itemType 'products';
          
      $newEntry->itemType->type 'text';  // specifying a type is recommended
          
          // Add item-specific attributes
          
      $newEntry->addGbaseAttribute('id'$products_array[$i]['products_id'], 'text');
          
      $newEntry->addGbaseAttribute('language''de''text');
          
      $newEntry->addGbaseAttribute('target_country''DE''text');
          
      $newEntry->addGbaseAttribute('Preis'$products_array[$i]['products_price'].' EUR''floatunit');
          
      $newEntry->addGbaseAttribute('Gewicht'$products_array[$i]['products_weight'].' kg''floatunit');

          
      $createdEntry $service->insertGbaseItem($newEntry$dryRun); 
      Die Dokumentation für die API ist auch nicht besonders aussagekräftig.

      Tatsache ist, dass er manche Artikel durchlässt und manche nicht.

      Grüsse
      Michael
      Zuletzt geändert von francosdad; 04.07.2009, 15:45.

      Kommentar


      • #4
        Habe mal versucht, dir deine $content-Zeile zu entwirren:

        PHP-Code:
        // stripslashes() an dieser Stelle?
        $content stripslashes($products_array[$i]['products_description']));

        // Wozu diese Zeile?
        $content preg_replace('/\<(i|p|span|font)\s.*?\>/im''<\1>'$content);

        $content strip_tags($content,
                
        '<p><a><br><br /><table><tr><td><ul><ol><li><img><center><h1><h2><h3><div>');

        // Wäre sinnvoller, das vor html_entitiy_decode() zu erledigen
        $content str_replace(
                array(
        '&nbsp;''&bdquo;''&ndash;''&euro;'), 
                array(
        ''      '"'      ''       'EUR'   ), $content);

        $content utf8_encode($content);

        // Nach utf8_encode() wegen der Entities, die nicht in ISO-8859-1 darstellbar
        // sind
        $content html_entity_decode($contentENT_QUOTES'UTF-8');

        $content str_replace('&''&amp;'$content); 
        Okay, wenn ich das richtig sehe, enthält $content dann noch HTML-Tags, müsste also im XML (SOAP?) potentiell als CDATA ausgewiesen werden. Ich tippe mal, das macht die Zend-Komponente automatisch, aber ich weiß es nicht. Vielleicht ist Type "text" ungleich Type "cdata" oder so.

        Mehr kann ich dazu nicht gesichert sagen, da ich damit noch nicht gearbeitet habe.

        Wäre vielleicht eine Idee, die Einträge, die durchgehen, mit denen zu vergleichen, die nicht durchgehen. Aber das hast du vermutlich schon gemacht.

        Kommentar


        • #5
          Danke, aber leider ist die Antwort nach wie vor:

          Code:
          <error type="data" field="description" reason="There is a problem with the character encoding of this attribute." />
          Es sind entweder noch weitere Codierungsfehler drin oder ich weiss es nicht, da nach wie vor nur ein paar Artikel übertragen werden.

          Die Dokumentation von Zend geht darauf auch nicht ein, nur das es sich um einen Atom Feed handelt und dieser UTF-8 sein muss.

          Mit CDATA gehts auch nicht, habe ich gerade versucht und der Fehler ist der selbe.

          Gruss
          Micha

          Kommentar


          • #6
            Also, ich scheine es gelöst zu haben.

            In der Beschreibung war noch ein formatierter <br /> Tag, quasi <br style="blabla">.
            Diesen habe ich mit beseitigt, mittels Ergänzung in
            PHP-Code:
            $content preg_replace('/\<(i|p|span|font|br)\s.*?\>/im''<\1>'$content); 
            Und jetzt läufts durch.

            Also vielen Dank und noch ein schönes Wochenende an alle; besonders aber @mermshaus!

            Michael

            Kommentar

            Lädt...
            X