Ankündigung

Einklappen
Keine Ankündigung bisher.

Umschlüsselung mit iconv in Codepage 850 unvollständig.

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

  • Umschlüsselung mit iconv in Codepage 850 unvollständig.

    Hallo,

    ich extrahiere Teile von Adressdaten in eine dBase-Datenbank für fax4box (AVM FAX-Programm). Nach meinen Recherchen verwendet dBase die CP850. Die Ausgangsdaten sind in UTF-8 kodiert.

    Mit
    PHP-Code:
    $name iconv('UTF-8','CP850//TRANSLIT',$name); 
    funktioniert die Konvertierung wie gewünscht (Umlaute) - nur das Et-Zeichen ('&' bzw. kaufmännisches Und) wird nicht korrekt konvertiert. Mit oder ohne '//TRANSLIT' kommt immer nur '&amp' heraus (HEX: 26616d703b).

    Das gilt auch für meine Versuche mit:
    PHP-Code:
    $name mb_convert_encoding($name'CP850'mb_detect_encoding($name'UTF-8, CP850, ISO-8859-15'true)); 
    Hat jemand einen Tipp, wie man diese Kleinigkeit noch ausmerzt?


    Danke

    Black Senator


  • #2
    Wahrscheinlich steht schon in den Quelldaten &amp drin. Mit iconv() hat das nichts zu tun, das ist nur für die Zeichenkodierung zuständig.

    Kommentar


    • #3
      Wenn es nur das Zeichen betrifft, würde ich vielleicht einfach ersetzen:
      PHP-Code:
      $name str_replace'&''&'iconv('UTF-8''CP850//TRANSLIT'$name) ); 
      Competence-Center -> Enjoy the Informatrix
      PHProcks!Einsteiger freundliche Tutorials

      Kommentar


      • #4
        Du suchst den Fehler an der falschen Stellen. Die Zeichensätze sind alle ASCII kompatible, damit ist auch das & überall gleich kodiert... Das in zwei unterschiedlichen Libraries ein derartiger Fehler enthalten ist, ist sehr sehr unwahrscheinlich.

        Kommentar


        • #5
          Hallo,

          mit
          PHP-Code:
          $name str_replace'&''&'iconv('UTF-8''CP850//TRANSLIT'$name) ); 
          läufts. Danke
          Ich hatte es letzte Nacht auf die Schnelle mit strtr versucht - hat aber nicht geklappt und für weitere String-Manipulationen war ich zu müde ...

          Danke

          Black Senator

          Kommentar


          • #6
            Es wäre aber trotzdem schlauer die Fehlerursache zu beheben und nicht einzelne auftretende Symptome zu überschminken. Nur weil es jetzt "funktioniert", heißt es nicht, dass es das morgen auch noch tut. Oder anders gesagt, wenn in den Quelldaten ein unerwünschtes "&" steht, ist die Wahrscheinlichkeit groß, dass noch andere unerwünschte Konstrukte vorkommen können.

            Kommentar


            • #7
              Also, die Quelldaten sind iCloud-Adressdaten (vCard/CardDAV). An keiner anderen Stelle - weder in den Apple Kontakten (Contact App) - wo ich die Daten anlege/führe, in iCloud.com, in Cardbook (Thunderbid-AddOn) oder im Download zu Fritzbox (Telefonbuch) taucht '&' in den Strings auf auf - sondern eben korrekt '&'.

              In http://php.net/manual/de/function.iconv.php findet sich als letzten User-Hinweis:
              The "//ignore" option doesn't work with recent versions of the iconv library. So if you're having trouble with that option, you aren't alone.
              - das wiederum lässt darauf implizit schließen, dass iconv nicht per se fehlerfrei ist.

              Kommentar


              • #8
                Zitat von Black Senator Beitrag anzeigen
                Also, die Quelldaten sind iCloud-Adressdaten (vCard/CardDAV). An keiner anderen Stelle - weder in den Apple Kontakten (Contact App) - wo ich die Daten anlege/führe, in iCloud.com, in Cardbook (Thunderbid-AddOn) oder im Download zu Fritzbox (Telefonbuch) taucht '&' in den Strings auf auf - sondern eben korrekt '&'.

                In http://php.net/manual/de/function.iconv.php findet sich als letzten User-Hinweis:

                - das wiederum lässt darauf implizit schließen, dass iconv nicht per se fehlerfrei ist.
                Du kannst fix davon ausgehen, dass & nicht von iconv(), sondern von deinen Daten kommt.

                Kommentar


                • #9
                  Ich gehe davon aus, dass es an der Datenquelle liegt, wie hellbringer bereits angemerkt hat.
                  Dennoch tut die str_replace()-Lösung in dem Falle nicht weh, denn es scheinen ja Daten mit & reinzukommen. Sollte das mal nicht der Fall sein, wird ja auch nichts ersetzt.
                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche Tutorials

                  Kommentar


                  • #10
                    Zitat von hellbringer Beitrag anzeigen

                    Du kannst fix davon ausgehen, dass & ... von deinen Daten kommt.
                    Ich nehme dich ´mal beim Wort: du meinst Daten - nicht Datenverarbeitung - dann müsste ich also in Cupertino anfragen, ob die mal ihr Coding überprüfen können?

                    Kann aber sein, dass der Fehler sich doch in der Datenverarbeitung einschleicht - nur finden hier sämtliche Codepage-bezogene String-Manipulationen mit Funktionen lang bewährter Klassen statt (für CardDAV-Zugriff und vCard-Parsing) - der Rest ist nur noch Fieldmapping in die Zielstruktur. Ich kann da nicht sehen, warum einzig und allein bei der Umschlüsselung in CP850 bei genau einem Char nun ein Fehler liegt. Aber ich mache gerne noch mal ein Code-Review.






                    Kommentar


                    • #11
                      Einfach ausprobieren
                      PHP-Code:
                      <?php
                      header
                      ('Content-Type: text/html; charset=iso-8859-15');
                      $name '&amp test & @ €';

                      $outputcp850 iconv('UTF-8','cp850//TRANSLIT',$name);
                      echo 
                      '<h4>Mit Echo ausgegeben: </h4>';
                      echo 
                      $outputcp850;
                      echo 
                      '<h4>Mit var_dump ausgegeben: </h4>';
                      var_dump($outputcp850);
                      ?>
                      Wenn das Zielsystem Windows ist würde ich auch nicht CP850 nehmen sondern cp1250 bzw. ISO_8859-15

                      EDIT:
                      Noch ein Hinweis falls der Code kopiert wird. Damit das korrekt funktioniert muss das Script als UTF-8 abgespeichert sein.

                      Kommentar


                      • #12
                        Zitat von protestix Beitrag anzeigen
                        Wenn das Zielsystem Windows ist würde ich auch nicht CP850 nehmen sondern cp1250 bzw. ISO_8859-15
                        Das Zielsstem ist - wie gesagt - fax4box: ein Windows-Programm von AVM, aber ... CP1250 oder ISO-8859-15 funktionieren nicht - dann werden die Umlaute und 'ß' nicht korrekt umgeschlüsselt ... und '&amp;' natürlich auch nicht...

                        Dein Coding muss ich noch probieren...

                        Kommentar


                        • #13
                          Zitat von protestix Beitrag anzeigen
                          Einfach ausprobieren
                          Okay: was sagt mir das jetzt?

                          Mit '&amp' :
                          Mit Echo ausgegeben:

                          & test & @ EUR Mit var_dump ausgegeben:

                          string(17) "& test & @ EUR"
                          Mit '&amp;' :
                          Mit Echo ausgegeben:

                          & test & @ EUR Mit var_dump ausgegeben:

                          string(1 "& test & @ EUR"

                          Kommentar


                          • #14
                            protestix : Verstehe nicht, was du mit dem Codeschnipsel zeigen möchtest? Aus &amp wird nichts anderes intern:
                            PHP-Code:
                            //  dein Code
                            debug::write($outputcp850);
                            // string(17) ASCII        "&amp test & @ EUR" 
                            var_dump taugt für sowas nichts.
                            jspit.de github

                            Kommentar


                            • #15
                              Okay: was sagt mir das jetzt?
                              Verstehe die Frage nicht.

                              Kennst du var_dump nicht, das steht im Handbuch.
                              Wunderst du dich über das & bei echo, dann schau in den Quelltext deines Browsers.

                              Ansonsten ist es genau so wie hier schon von anderen Helfern angemerkt wurde, nämlich dass die Funktion iconv das & nicht antastet, das Symbol aber schon, da es im Zielzeichensatz nicht vorhanden ist und weil du als FLag TRANSLIT angegeben hast wird das Eurosymbol korrekt in die Entsprechenden EUR Zeichen gewandelt.

                              Ich verweise hier noch mal auf hellbringers Beitrag #2. Das steht wie ein Dogma im Raum. Suche also woanders.

                              @jspit
                              Aus &amp wird nichts anderes intern:
                              Genau das sollte damit aufgezeigt werden.

                              Kommentar

                              Lädt...
                              X