ralphi: Zeichen elimenieren - POS Drucker druckt nicht

Hi Leute,

ich möchte alle Zeichen, die ein POS-Drucker im Standard-Modus mit Standard-Zeichensatz nicht drucken kann, umwandeln in Leerzeichen oder ausblenden.
Der Inhalt kommt von einem Textfeld, was ich nicht prüfen kann.

Auf den Drucker hab ich keinen Zugriff mehr – Testen kann ich auch nix.
Lediglich die Webseite mit dem Textfeld kann ich noch ändern.

Gibt es einen einfachen Befehl in php, der so was gefahrlos wandelt?

--
Viele Grüße aus LA
ralphi
"Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E.
  1. Hallo ralphi,

    Gibt es einen einfachen Befehl in php, der so was gefahrlos wandelt?

    $text = preg_replace('\w',' ', $text);

    Welche Zeichen der Drucker drucken kann, weiß ich nicht. \w sind alle lateinischen Buchstaben und arabische Ziffern, das ist also zu wenig. Und ob das gefahrlos ist, möchte ich auch nicht einschätzen.

    Bis demnächst
    Matthias

    --
    Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
    1. Hi,

      Gibt es einen einfachen Befehl in php, der so was gefahrlos wandelt?

      $text = preg_replace('\w',' ', $text);

      Welche Zeichen der Drucker drucken kann, weiß ich nicht.

      ich auch nicht; ich wäre mal davon ausgegangen, alles was ASCII ist, dürfte okay sein. Aber da ist ralphi tatsächlich zu geizig mit Info.

      \w sind alle lateinischen Buchstaben und arabische Ziffern, das ist also zu wenig.

      Du willst also alle Buchstaben und Ziffern aus dem ASCII-Bereich durch Leerzeichen ersetzen?
      Teufel nochmal, wie war das noch mit der Negation ...

      So long,
       Martin

      1. Hallo Der Martin,

        Du willst also alle Buchstaben und Ziffern aus dem ASCII-Bereich durch Leerzeichen ersetzen?
        Teufel nochmal, wie war das noch mit der Negation ...

        Aah ;-) \W ist die Negation von \w.

        Bis demnächst
        Matthias

        --
        Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
      2. Hi,
        Nun
        Der Drucker hängt noch an einem Kassensystem am Parallelport. Das druckt im page-mode.
        Ich drucke über LAN und schalte den Drucker in den Standart-Mod.

        $command = "\e\x40"; // ESC @ - init
        if( ! socket_send ( $sock , $command , strlen($command) , 0)) { $status = 1;}else{ $status = 0;}    
        $command = "\e\x53"; // ESC S - standart mode
        if( ! socket_send ( $sock , $command , strlen($command) , 0)) { $status = 1;}else{ $status = 0;}
        

        Der Drucker erhält den Job ohne Fehlermeldung über socket.
        95% werden gedruckt – 5% nicht.

        Meine Schlussfolgerung ist, dass irgend ein Zeichen dabei ist, was er nicht mag. Mein Problem ist, das ich die Jobs, die er nicht druckt nicht kenne :-(
        Die Umlaute hab ich schon konvertiert.

        Nun er druckt alle Buchstaben (außer Umlaute) und Zahlen – logo,
        *, :, =, ?,! und noch ein paar auch.

        Jetzt kann ich nur raten, ob es ein gängiges Zeichen ist: ; oder “, oder ob es was ungewöhnliches ist wie | oder ^.

        --
        Viele Grüße aus LA
        ralphi
        "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E.
        1. Hallo ralphi,

          Nun er druckt alle Buchstaben (außer Umlaute) und Zahlen – logo,
          *, :, =, ?,! und noch ein paar auch.

          Welche brauchst du denn?

          $text = preg_replace('[^A-Za-z0-9]',' ', $text); Nach der neun zählst du noch all die auf, die du haben möchtest. Zeichen, die bei regulären Ausdrücken eine Sonderbedeutung haben, musst du mit einem Backslash maskieren. Ob das der Fall ist, sieht man -so man es nicht weiß- am besten auf https://regex101.com/

          Bis demnächst
          Matthias

          --
          Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
          1. Hi,
            das mit preg_replace ist ein toller Tipp von Euch :-)

            Ich muss gestehen, dass ich mit dem REGEXP so meine Schwierigkeiten habe.
            Wie würde es den aussehen, wenn ich zu [^A-Za-z0-9] noch zB. ":, &, !" zulassen möchte?

            --
            Viele Grüße aus LA
            ralphi
            "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E.
            1. Hallo ralphi,

              das mit preg_replace ist ein toller Tipp von Euch :-)

              Das muss gar nicht soo toll sein.

              Ich muss gestehen, dass ich mit dem REGEXP so meine Schwierigkeiten habe.
              Wie würde es den aussehen, wenn ich zu [^A-Za-z0-9] noch zB. ":, &, !" zulassen möchte?

              • [] definiert im Wesentlichen eine Menge erlaubter Zeichen
              • [^] ist die Negation dieser Zeichen
              • [^A-Za-z0-9] sind dann alle Zeichen außer lateinische Buchstaben und arabische Ziffern
              • Die drei gewünschten Zeichen dürfen unmaskiert verwendet werden, also

              [^A-Za-z0-9:&!]

              Bis demnächst
              Matthias

              --
              Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
  2. Moin!

    POS-Drucker im Standard-Modus mit Standard-Zeichensatz

    Gibt es einen einfachen Befehl in php, der so was gefahrlos wandelt?

    Definitiv die Standardvorgehensweise:

    $firstDoThis = thinkAbout(getManual(getPrinterModel()));
    

    anders (in Javascript) ausgedrückt:

    firstDoThis = function() {
        return thinkAbout(getManual(getPrinterModel()));
    }
    

    Ergänzt:

    $infos['manual'] = getManual(getPrinterModel());
    if (! infos['manual']) {
        $infos['secondChance'] = doWebSearch(getPrinterModel());
    }
    $firstDoThis = thinkAbout($infos);
    

    Für getPrinterModel() gibt es aber keinen Ersatz.

    Jörg Reinholz

    1. Hi,
      Ist ein Bixolon F310
      Wie alle Pos-Drucker unterstützt der auch die Grund-Kommandos von EPSON ESC/P und die gängigen Sprach-Zeichentabellen sind auch gleich.

      --
      Viele Grüße aus LA
      ralphi
      "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E.
      1. Moin!

        Wie alle Pos-Drucker unterstützt der auch die Grund-Kommandos von EPSON ESC/P und die gängigen Sprach-Zeichentabellen sind auch gleich.

        Na dann:

        function ascii_filter($str, $replacement='') {
         return preg_replace('/[[:^print:]\r\n]/', $replacement, $str); //
        }
        

        Lässt nur die druckbaren ASCII-Zeichen durch, zusätzlich Zeilenumbruch (\n) und Wagenrücklauf (\r).

        Willst Du ausgefilterte Zeichen ersetzen, dann Aufruf mit:

        ascii_filter( 'Was für ein Ärger!' , '_' );
        

        Allerdings frage ich mich, ob es nicht besser wäre, den korrekten Treiber zu installieren. Oder ist das schon geschehen?

        Jörg Reinholz

        1. Hi,
          klasse – Vereinfachungen, machen den Einstieg in RegEx etwas leichter :-)

          Da ich nicht weiß, welches Zeichen das drucken blockiert, versuch ich's mal mit:

                  $zeile = ereg_replace("[[:cntrl:]]"," ",$zeile);
                  $zeile = ereg_replace("[[^:print:]]"," ",$zeile);
          
          // The [[:alnum:]] character class represents alphabetic and numeric characters, and it is same as using [a-zA-Z0-9] in regular expression.
          // The [[:blank:]] represents horizontal space, tab-space characters in regular expression.
          // The [[:cntrl:]] character class matches characters  form feed, backspace, tabspace character etc. All these characters have ASCII value less than 31.
          // [[:punct:]] This character class identifies all the punctuation characters.
          // [[:space:]] This character class identifies all space characters like "f" -form feed, "n"- newline, "r"- carriage return, "t" - tab, "v" -vertical tab.
          //  [[:xdigit:]] This character class helps in finding hexadecimal digit character.
          

          Mal kucken, ob's jetzt alles druckt (Umlaute natürlich vorweg eleminiert)

          --
          Viele Grüße aus LA
          ralphi
          "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E.
          1. Moin!

            Mal kucken, ob's jetzt alles druckt (Umlaute natürlich vorweg eleminiert)

            Tu das nicht!

            <?php
            $str="SØR\r\nsœur\r\nSörewald";
            echo ereg_replace("[[^:print:]]"," ",$str), "\n";
            

            Ergebnis:

            $ php Test_oe 
            PHP Deprecated:  Function ereg_replace() is deprecated in /tmp/Test_oe on line 3
            
            Deprecated: Function ereg_replace() is deprecated in /tmp/Test_oe on line 3
            SØR
            sœur
            Sörewald
            
            1. Funktioniert nicht wie gewünscht. ("Ø" und "œ" werden nicht gefiltert).
            2. Die Funktion ereg_replace fliegt demnächst aus PHP raus. Und Dein Kunde wird ergo sauer, wenn er merkt, dass Du eine schon längst (ich hab hier das alte PHP 5.5.9 benutzt) als "deprecated" abgekündigte Funktion verwendest und so dafür sorgst, dass er schon bald (sicherlich einen anderen) Dienstleister bezahlen muss.

            Jörg Reinholz

            1. Hi Jörg,
              danke für den Hinweis.
              Allerdings mit:

              echo preg_replace("[[:^print:]]"," ",$x)."\n";
              

              zieht er mir zu viel Zeichen raus.
              Ich weiß, dass er zB. email-Adressen mit @ und Punkt druckt.

              Ich werde demnächst mal bei meinem Kunden vorbeifahren und die ASCII- Tabelle durchlaufen lassen.
              Erst dann weiß ich was für ein Zeichen rumärgert :-(

              --
              Viele Grüße aus LA
              ralphi
              "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E.
              1. Moin!

                echo preg_replace("[[:^print:]]"," ",$x)."\n";
                

                zieht er mir zu viel Zeichen raus.
                Ich weiß, dass er zB. email-Adressen mit @ und Punkt druckt.

                Hä? Wenn Du die Syntax frei verballhornst, dann wundere Dich nicht über falsche Ergebnisse!

                <?php
                $haystack = "Ödipuß<foo@example.com>\r\n";
                $search   = '/[^[:print:]ÖöÄäÜüß]\r\n/';
                echo preg_replace($search, '_', $haystack);
                echo "Ende\n";
                

                Ergebnis:

                fastix@trainer:/tmp$ php test_replace.php 
                Ödipuß<foo@example.com>
                Ende
                fastix@trainer:/tmp$ 
                

                Versuch 2:

                <?php
                $haystack = "Ödipuß<foo@example.com>\r\n";
                $search   = '/[^[:print:]ÖöÜüÄäß\n\r]/';
                echo preg_replace($search, '_', $haystack);
                echo "Ende\n";
                

                Ergebnis:

                fastix@trainer:/tmp$ php test_replace.php 
                Ödipuß<foo@example.com>
                Ende
                fastix@trainer:/tmp$ 
                

                Versuch 3:

                <?php
                $haystack = "Ödipuß<foo@example.com>\r\n";
                $search   = '/[^[:print:]ÖöÜüÄäß\n\r]/';
                echo preg_replace($search, '_', $haystack);
                echo "Ende\n";
                

                Ergebnis:

                php test_replace.php 
                __dipu__<foo@example.com>
                Ende
                fastix@trainer:/tmp$ 
                

                Es geht also sehr wohl.

                BTW: Kann es sein, dass dem Drucker "Seiten" geliefert werden, bei denen der druckbare Bereich überschritten wird? Grund für die Annahme: Im Handbuch laß ich was von wegen mitgelieferte Schriftart benutzen.

                Jörg Reinholz

                1. Moin!

                  BTW: Kann es sein, dass dem Drucker "Seiten" geliefert werden, bei denen der druckbare Bereich überschritten wird? Grund für die Annahme: Im Handbuch laß ich was von wegen mitgelieferte Schriftart benutzen.

                  Versuch 3 nochmal, beim Copy und Paste was vertan:

                  <?php
                  $haystack = "Ödipuß<foo@example.com>\r\n";
                  $search   = '/[^[:print:]\n\r]/';
                  echo preg_replace($search, '_', $haystack);
                  echo "Ende\n";
                  

                  Ergebnis:

                  fastix@trainer:/tmp$ php test_replace.php 
                  __dipu__<foo@example.com>
                  Ende
                  fastix@trainer:/tmp$ 
                  

                  Jörg Reinholz

                  1. Hi,
                    ich probier mal:

                    $search   = '/[^[:print:]]/';
                    

                    Den Zeilenumbruch setz ich in der Formatierung drumrum. In den Daten vom Eingabe-Textfeld brauch ich den nicht.
                    Was bedeutet eigentlich der Slash am Anfang und Ende?
                    Viele Grüße aus LA
                    ralphi

                    --
                    "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E.
                    1. Moin!

                      Was bedeutet eigentlich der Slash am Anfang und Ende?

                      Dass sind die Zeichen, die den regulären Ausdruck einleiten und beenden. Per Definition kann es jedes beliebige Zeichen sein aber:

                      1. hat sich der Slash durchgesetzt und
                      2. verstehen manche Programme, die reguläre Ausdrücke verstehen, nichts anderes.

                      Jörg Reinholz