Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeichensatz für XML Ausgabe ändern

Einklappen

Neue Werbung 2019

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

  • Zeichensatz für XML Ausgabe ändern

    Hallo,

    ich habe eine PHP Umgebung mit UTF-8 als default encoding und lade Daten aus einer DB, ebenfalls UTF-8. Diese Daten möchte ich in einem XML Dokument speichern, allerdings in ISO-8859-15. Zeichen, die in ISO-8859-15 nicht enthalten sind, sollen einfach wegfallen.

    Ich benutze folgendes Testskript:
    PHP-Code:
    $utf 'ЃЁABC';
    $enc mb_detect_encoding($utf);
    $con iconv($enc'ISO-5589-15//IGNORE'$utf); 
    Bekomme allerdings im xdebug nur Schmierzeichen zu sehen, $con ist leer und erhalte in der ZendFramework Applikation, wo ich das Testskript aufrufe, folgende Fehlermeldung:

    Notice: iconv(): Wrong charset, conversion from `UTF-8' to `ISO-5589-15//IGNORE' is not allowed

    Habe ich eine andere Möglichkeit für die Konvertierung mit PHP?

    PHP 5.3 / Netbeans 6.7 / xdebug 2.0.5.5.3 / ZF 1.10.2

    Danke

  • #2
    Hast dus schon ohne //IGNORE bzw. mal mit //TRANSLIT probiert?

    Was ist denn ISO-5589-15 fuer ein Zeichensatz?
    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

    Kommentar


    • #3
      Hallo,

      es handelt sich vermutlich um einen Zahlendreher.

      Es ist bestimmt der Zeichensatz ISO-8859-15 gemeint.

      Gruß
      Michael Horn

      Kommentar


      • #4
        Zitat von censis Beitrag anzeigen
        es handelt sich vermutlich um einen Zahlendreher.
        Es ist bestimmt der Zeichensatz ISO-8859-15 gemeint.
        Wenn das mal nicht der entscheidende Tipp war
        "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

        Kommentar


        • #5
          ich brauch Urlaub

          Dieser Fehler liegt an dem Typo im Testskript und ich hab auch noch die falsche Fehlermeldung eingefügt.

          Im "richtigen" Skript ist der Zeichensatz korrekt ISO-8859-15 und es gibt folgenden Fehler:

          Notice: iconv(): Detected an incomplete multibyte character in input string

          Es gibt aber keine Angabe, um welchen character es sich handelt. Auch ein Try catch kann den Fehler nicht abfangen.

          PHP-Code:
          if(!empty ($input)) {
                      
          $con '';
                      try {
                          
          $enc mb_detect_encoding($input);
                          
          $con iconv($enc'ISO-8859-15//IGNORE'$input);
                      }
                      catch(
          Exception $ex ){
                          
          Utils::logError($ex->getMessage());
                      }
                      return 
          $con;
                  }
                  else {
                      return 
          $input;
                  } 

          Kommentar


          • #6
            Zitat von r2ls Beitrag anzeigen
            Im "richtigen" Skript ist der Zeichensatz korrekt ISO-8859-15 und es gibt folgenden Fehler:

            Notice: iconv(): Detected an incomplete multibyte character in input string
            Nicht mehr, wenn du wie vorgeschlagen //TRANSLIT benutzt.

            Es gibt aber keine Angabe, um welchen character es sich handelt.
            Das siehst du dann sehr schnell, weil diese beiden Zeichen durch ? ersetzt werden.
            [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

            Kommentar


            • #7
              soweit, so gut. Es wird schonmal fehlerfrei abgespeichert.

              Allerdings kommen keine Umlaute durch, obwohl sie im Zeichensatz enthalten sind:

              utf8string = 'übrige'
              mb_convert_encoding oder iconv nach iso-8859-15
              neuer string = 'brige'

              Kommentar


              • #8
                ist Dein Script als utf8 gespeichert ?

                Im "richtigen" Skript
                es ist nicht ok hier falsche Scripts zu posten.
                Poste immer das Originalscript,
                damit wir nicht falsche Vermutungen anstellen.
                Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

                Kommentar


                • #9
                  PHP-Code:
                  $utf 'übrige';
                  $enc mb_detect_encoding($utf);
                  echo 
                  utf8_encode(iconv($enc'ISO-8859-15//IGNORE'$utf)); 
                  gibt mir wie erwartet "übrige" wieder aus.
                  [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                  Kommentar


                  • #10
                    dann nochmal komplett:

                    php.ini:
                    default_charset = "utf-8"

                    PHP-Code:
                    public static function getIsoString($in) {

                            if(!empty (
                    $in)) {
                                try {
                                    
                    $enc mb_detect_encoding($in);
                                    
                    $con iconv($enc'ISO-8859-15//IGNORE'$in);
                                    
                    //$con = mb_convert_encoding($in,  'ISO-8859-15', $enc);
                                    
                    return Utils::escapeXml($con);
                                }
                                catch(
                    Exception $ex ){
                                    
                    Utils::logError($ex->getMessage());
                                }
                                return 
                    'CharsetConversionError';
                            }
                            else {
                                return 
                    $in;
                            }    } 
                    Ein utf8_encode macht doch dort keinen Sinn. Ich will doch als iso-8859-15 speichern. Oder hab ich da ein Verständnisproblem?

                    Kommentar


                    • #11
                      Zitat von r2ls Beitrag anzeigen
                      php.ini:
                      default_charset = "utf-8"
                      Für das Problem uninteressant.


                      Ein utf8_encode macht doch dort keinen Sinn. Ich will doch als iso-8859-15 speichern. Oder hab ich da ein Verständnisproblem?
                      Das war nur dazu gedacht, die Testausgabe auf meinem System, wo alle PHP-Scripte in UTF-8 sind, sinnvoll betrachten zu können.

                      Nur die iconv-Zeile ergibt bei mir "�brige", das ü ist also in irgendwas umgewandelt worden, was sich in UTF-8 nicht darstellen lässt - wohl in ein ü in ISO-8859-15 kodiert, schliesslich soll das Script ja genau das machen.
                      Und mit utf8_encode wandle ich das dann wieder um, um es mir anzeigen zu lassen und kontrollieren zu können. Ich sehe wieder ein ü, also hat das Script offenbar alles exakt so gemacht, wie es sollte.
                      [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                      Kommentar


                      • #12
                        Juhu, es hat geklappt.

                        Der Fehler lag in der Datenbank
                        Dort wurden einige strings mehrfach dekodiert, so dass manche einmal enkodiert und manche zweimal enkodiert werden und dass noch unterschieden werden.

                        Dass wird die Datenbankleute noch ein paar Kaffee kosten

                        Danke für die Unterstützung.

                        Hier das vollendete Werk:

                        PHP-Code:
                        public static function getIsoString($in) {

                                if(!empty (
                        $in)) {
                                    try {

                                        if(!
                        mb_check_encoding$in'utf-8')){
                                            
                        $in utf8_encode($in);
                                        }

                                        
                        $con utf8_encode(iconv('UTF-8''ISO-8859-15//IGNORE'$in));

                                        return 
                        Utils::escapeXml($con);
                                    }
                                    catch(
                        Exception $ex ){
                                        
                        Utils::logError($ex->getMessage());
                                    }
                                    return 
                        'CharsetConversionError';
                                }
                                else {
                                    return 
                        $in;
                                }
                            } 

                        Kommentar

                        Lädt...
                        X