Silvio: Was sind "wide characters"?

Hallo,

ich möchte HTML-Entities aus einem String entfernen:

use HTML::Entities;
print decode_entities("Wir m&oumlchten dafür 10 € haben");

Dabei erhalte diese Fehlermeldung.

Wide character in print at ...

Ich habe dann probiert, was an dem String 'falsch' sein könnte und bin dann darauf gestoßen, dass das "€" das Problem ist. Nur warum?

Wie kann ich das Problem beheben?

Vielen Dank

  1. Hallo,

    ich möchte HTML-Entities aus einem String entfernen:

    use HTML::Entities;
    print decode_entities("Wir m&oumlchten dafür 10 € haben");
    
    

    Dabei erhalte diese Fehlermeldung.

    Wide character in print at ...

    Diese FM erscheint, weil die Entities in das Perl-interne Codierungs-Format umgewandelt wurden und somit nicht für die Ausgabe auf STDOUT geeignet sind. Es gibt 2 Möglichkeiten:

    1. use Encode; und mit $octets = encode('UTF-8', $characters, Encode::FB_CROAK); die Oktetten wiederherstellen, da müsstest Du jedoch jeden String einzeln anfassen,
    2. use bytes; vor der print Ausgabe, das sorgt dafür daß die richtigen Bytesequenzen rausgehen.

    MfG

    PS:

    Ich habe dann probiert, was an dem String 'falsch' sein könnte und bin dann darauf gestoßen, dass das "€" das Problem ist. Nur warum?

    Die FM erscheint ab 3 Bytes (Oktetten). Bei den Umlauten die nur 2 Oktetten haben kommt sie nicht, das wird noch toleriert.

    1. Hmmmm, hatte das Problem aus einem Skript extrahiert. Im Original enstand der Fehler, wenn ein Skript im Browser aufgerufen wird, welches das decode_entities ausführen sollte und lieferte diese Fehlermeldung

      Cannot decode string with wide characters at /usr/lib/x86_64-linux-gnu/perl/5.22/Encode.pm line 221.

      Dann werde ich mal alle Entities 'per Hand' durch einfache Stringersetzung austauschen...

      1. Dann werde ich mal alle Entities 'per Hand' durch einfache Stringersetzung austauschen...

        Das löst das eigentliche Problem aber nicht.

        use HTML::Entities;
        use bytes;
        print decode_entities('€');
        # Ausgabe ok, keine Fehlermeldung
        

        use bytes; sollte genügen. Das Modul wird ohnehin per Default geladen, es ist ein Pragma, use bytes; schaltet es ein no bytes; schaltet es aus. MfG

        1. Oh, vielen Dank. Ja, das kommt keine Fehlermeldung. Einzig das '€' wird in meinem Fall zu einem '?'.

          Ich habe nach googlen noch den Hinweis auf use Text::Unidecode gefunden. Lokal an der Konsole klappt das, nun müsste ich nur noch meinen Admin überzeugen, dass er das Modil auf dem Webserver installiert.

          1. Oh, vielen Dank. Ja, das kommt keine Fehlermeldung. Einzig das '€' wird in meinem Fall zu einem '?'.

            Ich habe nach googlen noch den Hinweis auf use Text::Unidecode gefunden. Lokal an der Konsole klappt das, nun müsste ich nur noch meinen Admin überzeugen, dass er das Modil auf dem Webserver installiert.

            Na, die richtigen Oktetten für UTF-8 hast Du doch, wenns auf der Konsole klappt, dann klappt das auch im Browser ohne weitere Module. Entscheidend ist der richtige Header

            Content-Type: text/html; charset=UTF-8

            dann wird auch das € Zeichen richtig dargestellt. MfG

      2. Tach!

        Dann werde ich mal alle Entities 'per Hand' durch einfache Stringersetzung austauschen...

        Das wird das beste sein, wenn es sich um eine einmalige Angelegenheit und nicht um eine Behandlung immer wieder neuer Daten handelt. Suchen und Ersetzen in vielen Dateien bekommen moderne Editoren problemlos hin.

        dedlfix.