walter: Problem: ASCII-Zeichen 252

Hallo und Bitte um Hilfe!

Es soll ein Adressdatensatz aus einer My-sql-Datenbank auf Aufkleber gedruckt werden.
Nach langem Rumprobieren funktioniert folgende Lösung leider nur TEILWEISE :(

1: $adrtext = $datensatz[adresse];
2: $adrtext1 = str_replace("õ","ä",$adrtext); //ASCII 228 -> 132
3: $adrtext2 = str_replace("÷","ö",$adrtext1); //ASCII 246 -> 148
4: $adrtext3 = str_replace("³","ü",$adrtext2); //ASCII 252 ?????? -> 129
5: $fp = fopen( "adr.txt", "w" );
6: fwrite( $fp, $adrtext3."\n\n\n" );
7: fclose( $fp );
8: exec("TYPE adr.txt >lpt1");

Der einzige Fehler ist in Zeile 4 :
das ASCII-Zeichen 252, das für mich auf meiner Tastatur erreichbar ist. ist blöderweise die "hochgestellte 3".
Ich bräuchte aber das "hochgestellte n"( das spuckt mein Drucker statt dem "ü" aus), damit ich das "ü" umwandeln kann.
Was mir nicht in den Schädel will, ist folgendes:
Ich bin in der Lage dieses Zeichen zu erzeugen (sonst wärs ja nicht da), aber ich find keinen Weg, es wieder "wandeln".
Oder erzeugt das eines der beteiligten Programme??
Aber auch dann müsste es doch einen Weg geben .....

Kann mir jmd. weiterhelfen?
Walter

  1. Hi,

    Es soll ein Adressdatensatz aus einer My-sql-Datenbank auf Aufkleber gedruckt werden.
    Nach langem Rumprobieren funktioniert folgende Lösung leider nur TEILWEISE :(

    Nein, die funktioniert gar nicht, dae ist reiner Zufall, dae in einigen Fällen das richtige rauskommt.
    Du reparierst hier nämlich nicht den Fehler.

    Der einzige Fehler ist in Zeile 4 :
    das ASCII-Zeichen 252, das für mich auf meiner Tastatur erreichbar ist. ist blöderweise die "hochgestellte 3".

    Ein Zeichen mit der Bitfolge dezimal 252 kann alles mögliche sein, nicht nur '³' (funktioniert mit meinem Tastaturlayout und latin-15 sogar direkt, ist aber beim mir dezimal 179)

    Ich bräuchte aber das "hochgestellte n"( das spuckt mein Drucker statt dem "ü" aus), damit ich das "ü" umwandeln kann.

    Nein, Du brauchst den eigentlichen Fehler, damit Du das reparieren kannst.
    Von wo aus druckst Du denn? Vom Browser? Welcher Browser? Was steht in der Zeichensatz-Angabe? Was steht überhaupt in der Eingabe zur DB? Kannst Du die drucken? Wie gibts Du die Adressen ein, über ein HTML-Formular? Was steht dort in der Zeichensatz-Angabe? Wie sieht die Druckvorschau aus? Kannst Du in eine Datei drucken, und dann diese Datei drucken?

    Was mir nicht in den Schädel will, ist folgendes:
    Ich bin in der Lage dieses Zeichen zu erzeugen (sonst wärs ja nicht da), aber ich find keinen Weg, es wieder "wandeln".
    Oder erzeugt das eines der beteiligten Programme??
    Aber auch dann müsste es doch einen Weg geben .....

    Ja, korrekte Zeichensätze bzw korrekte Zeichensatzumwandlung. Irgendwas läuft da bei mindestens einem beteiligtem Programm nicht so, wie Du das möchtest. (ich sage hier betont nicht: "irgendwo läuft 'was falsch"!)

    so short

    Christoph Zurnieden

    1. Hi Christoph!

      Von wo aus druckst Du denn? Vom Browser? Welcher Browser? Was steht in der Zeichensatz-Angabe? Was steht überhaupt in der Eingabe zur DB? Kannst Du die drucken? Wie gibts Du die Adressen ein, über ein HTML-Formular? Was steht dort in der Zeichensatz-Angabe? Wie sieht die Druckvorschau aus? Kannst Du in eine Datei drucken, und dann diese Datei drucken?

      »»
      Die Adressen werden über ein HTML-Formular eingegeben.
      Zeichensatzangabe: ISO-8859-1.
      Ich arbeite im Firefox und geb dort das "Tastatur-ü" ein.
      Bei der Kontrolle über php-MyAdmin les ich ein "ü".
      Ich schreib $datensatz[adresse] in eine Datei, die
      ich mit exec(type datei >lpt1) über die Konsole an den Drucker geb
      ( steht alles in meinem Ursprungsposting ;).

      Kannst du jetzt mehr mit damit anfangen?
      Hoffentlich,
      Walter

      1. Hi,

        Die Adressen werden über ein HTML-Formular eingegeben.
        Zeichensatzangabe: ISO-8859-1.
        Ich arbeite im Firefox und geb dort das "Tastatur-ü" ein.
        Bei der Kontrolle über php-MyAdmin les ich ein "ü".
        Ich schreib $datensatz[adresse] in eine Datei, die
        ich mit exec(type datei >lpt1) über die Konsole an den Drucker geb
        ( steht alles in meinem Ursprungsposting ;).

        Naja, von "alles" kann da aber auch mit sehr viel gutem Willen nicht die Rede sein! Auch waren meine Fragen oder besser die "hastige" Formulierung zusätzlich noch rethorischer Art und meinten etwas überspitzt etwa: "mit so wenig Angaben kann doch kein Schwein 'was anfangen"

        Aber jetzt kann es schon etwas weitergehen:
        Wenn Du händisch eine Datei erstellst und dort einen Beispieltext reinschreibst, der möglichst Buchstaben enthält, die außerhalb des ANSI Bereiches liegen (z.B. Umlaute bzw Deine "Problemkinder") und diese Datei dann mit genau derselben Handlung 'TYPE datei >lpt1' ausdrucken läßt, kommt dann das Richtige 'raus?

        so short

        Christoph Zurnieden

        1. »»"mit so wenig Angaben kann doch kein Schwein 'was anfangen"
          Pardon, mösjö

          Aber jetzt kann es schon etwas weitergehen:
          Wenn Du händisch eine Datei erstellst und dort einen Beispieltext reinschreibst, der möglichst Buchstaben enthält, die außerhalb des ANSI Bereiches liegen (z.B. Umlaute bzw Deine "Problemkinder") und diese Datei dann mit genau derselben Handlung 'TYPE datei >lpt1' ausdrucken läßt, kommt dann das Richtige 'raus?

          Keine Ahnung ... danke für die Handlungsanweisung .. werde probieren.
          ... und wie ich Kalle schon gebeten hab, bitte am Thread dranbleiben -

          • Lösung dringend gebraucht. Danke.
            Walter
          1. Hi,

            »»"mit so wenig Angaben kann doch kein Schwein 'was anfangen"
            Pardon, mösjö

            Du brauchst Dich nicht bei mir zu entschuldigen, es ist Dein Problem, wenn aufgrund zu weniger Angaben keine Lösung für Dein Problem gefunden wird.

            Wenn Du händisch eine Datei erstellst und dort einen Beispieltext reinschreibst, der möglichst Buchstaben enthält, die außerhalb des ANSI Bereiches liegen (z.B. Umlaute bzw Deine "Problemkinder") und diese Datei dann mit genau derselben Handlung 'TYPE datei >lpt1' ausdrucken läßt, kommt dann das Richtige 'raus?

            Keine Ahnung ... danke für die Handlungsanweisung .. werde probieren.

            Na, komm, so lange kann das doch nicht dauern! Was kommt denn dabei jetzt raus?

            ... und wie ich Kalle schon gebeten hab, bitte am Thread dranbleiben -

            ... bis der Thread unten rausfliegt. Das wird er aber nicht, solange da irgendjemand regelmäßig drin postet. (unter einmal täglich reicht, also fang nicht an hier alle 30 Minuten einen Post reinzusetzen ;-)

            so short

            Christoph Zurnieden

            1. Hallo Christoph, hallo Kalle!

              (Irgendwie komm ich mit dem Posten hier nicht ganz klar .. )

              Also .. beide Vorschläge durchgeführt.
              Ging nicht schneller .. mensch muß auch noch andere Sachen machen;)

              Wenn Du händisch eine Datei erstellst und dort einen Beispieltext reinschreibst .... kommt dann das Richtige 'raus?

              Nein .. (siehe unten)

              »»Folgender Lösungsansatz sollte helfen:
              Erzeuge dir per PHP-Programm alle ASCII-Codes ab 032 (Leerzeichen) und schicke sie an den Drucker ...

              .. und der zeigt zum Beispiel ...
              fürs "kleine ü" : ascii252->ein "hochgestelltes n".
              fürs "kleine ä" : ascii228->ein "griech.Sigma".
              fürs "kleine ö" : ascii246->ein "waagrechter Strich mit Punkt drüber und drunter".

              Hmm ... könnt ihr daraus jetzt etwas ersehen?

              Gruß vom Walter

              1. Hi,

                (Irgendwie komm ich mit dem Posten hier nicht ganz klar .. )

                Wieso? Geht doch!

                Also .. beide Vorschläge durchgeführt.
                Ging nicht schneller .. mensch muß auch noch andere Sachen machen;)

                Ich dachte, es wäre dringlich?

                Wenn Du händisch eine Datei erstellst und dort einen Beispieltext reinschreibst .... kommt dann das Richtige 'raus?

                Nein .. (siehe unten)

                [...]

                Hmm ... könnt ihr daraus jetzt etwas ersehen?

                Ja, Dein Drucker versteht Dich nicht.
                Genauer: Du kannst nicht direkt mit TYPE auf den Druckerport schreiben, nur über den installierten Win32-Treiber. Das es überhaupt ging wundert mich sogar ziemlich, was für ein Drucker ist es denn?

                so short

                Christoph Zurnieden

                1. Moin Christoph,

                  Hmm ... könnt ihr daraus jetzt etwas ersehen?

                  Ja, Dein Drucker versteht Dich nicht.
                  Genauer: Du kannst nicht direkt mit TYPE auf den Druckerport schreiben, nur über den installierten Win32-Treiber. Das es überhaupt ging wundert mich sogar ziemlich, was für ein Drucker ist es denn?

                  Für die Adressaufkleber auf Endlospapier ein "Nadler" : Star LC 24-100.

                  (Bei der DOSe wundert mich zwischenzeitlich auch einiges .. direkter Druck übern Druckerport war/ist für mich aufm Amiga kein Problem.)

                  Was heißt das jetzt für mich ?
                  Ich muß übern Treiber gehen?
                  Wäre das " exec(PRINT datei) " ?
                  Hab ich schon versucht, aber bei der Variante, kann ich meinen Drucker nicht überreden, den Druck nach 5 Zeilen Adresse zu stoppen. Ich kann machen, was ich will, er "wirft ne A4-Seite" aus.

                  Verzweiflung macht sich breit ...
                  Gruß,Walter

                  1. Hi,

                    Für die Adressaufkleber auf Endlospapier ein "Nadler" : Star LC 24-100.

                    (Bei der DOSe wundert mich zwischenzeitlich auch einiges .. direkter Druck übern Druckerport war/ist für mich aufm Amiga kein Problem.)

                    Dann nimm den Amiga.
                    Nein, ich meine das durchaus ernst.

                    Was heißt das jetzt für mich ?
                    Ich muß übern Treiber gehen?
                    Wäre das " exec(PRINT datei) " ?

                    Ich glaube ja (kenne mich mit DOS/Windows nicht so aus)

                    Hab ich schon versucht, aber bei der Variante, kann ich meinen Drucker nicht überreden, den Druck nach 5 Zeilen Adresse zu stoppen. Ich kann machen, was ich will, er "wirft ne A4-Seite" aus.

                    Ja, am Ende wird ein Paperfeed (0x0c) eingesetzt.

                    Dann komst Du wohl tatsächlich nicht drumherum, Dir einen eigenen Triber zu schreiben (Wenn Du Postscript kannst, könnetst Du es damit versuchen, aber ich bezweifele das, habe auch nichts entsprechendes gefunden). Ist in diesem Fall aber einfach. Dein Ansatz war schon ganz richtig, nur nicht sauber.

                    Du hast ja schon eine Probedruck gemacht (das mit der Tabelle) und weißt welcher Buchstabe falsch ist und welcher dafür eingesetzt werden muß und wie die dezimalen Werte dafür sind. Statt nun mühselig auf der Tastatur rumzuklimpern, nimmst Du einfach die dezimalen Werte aus der Tabelle.

                    Dafür kannst Du ord() nehmen. ord($zeichen) gibt den Zeichenwert zurück. Mit $string{$nummer} bekommst Du das Zeichen an der $nummer-Stelle des Strings $string. MIt ord($string{$nummer}) also den Wert. Das kannst Du dann als Bedingung in einen switch() einbauen und dann einfach die Nummer ändern (kannst Du ab php4 direkt anweisen, also $string{$number} = $ersatznummer).

                    Folgendes von php.net geklaut:

                    function convert_text($str){
                       $out = '';
                       for ($i = 0; $i<strlen($str);$i++){
                        $ch = ord($str{$i});
                        switch($ch){
                              case 252: $out .= chr(129);break; //u Umlaut
                              case 220: $out .= chr(154);break;//U Umlaut
                              case 228: $out .= chr(132);break;//a Umlaut
                              case 196: $out .= chr(142);break;//A Umlaut
                              case 214: $out .= chr(153);break;//O Umlaut
                              case 246: $out .= chr(148);break;//o Umlaut
                              case 223: $out .= chr(225);break;//SZ
                              default : $out .= chr($ch) ;
                        }
                       }
                       return $out;
                     }

                    Nachteil: Du mußt den gesammten String abklappern. Das mußt Du aber normalerweise immer.

                    Etwas habe ich noch gefunden, das sieht eleganter aus und würde auch für Unicode funktionieren (ist auch aus einer Umwandlungsroutine geklaut ;-):

                    <?php
                    $map_array = array(
                      "\xb2" => "\xe4", /* hochgestellte 2 gegen 'ä' austauschen */
                      ...
                    );
                    function myPrinterDriver($str) {
                            global $map_array;
                            return  strtr($str, $map_array);
                     }
                    ?>

                    Ich habe aber hier kein PHP drauf und kann das nicht ausprobieren.

                    Ganz regulär wäre es natürlich, wenn Du herausfindest, welchen Code Du hast und welchen Code der Drucker möchte. Dann gibt es iconv(), das z.B. von windows-1251 nach latin-1 umwandeln kann. Soviele sind das aber nicht, könntest Du glatt ausprobieren. Allerdings weiß ich nicht, ob Du die entspr Lib hast, siehe auch http://de3.php.net/manual/en/ref.iconv.php (da siehst Du auch, woher ich den Code oben geklaut habe ;-)

                    Verzweiflung macht sich breit ...

                    Ruhe ist die erste Bürgerpflicht! >;->

                    so short

                    Christoph Zurnieden

                    1. Hallo Christoph !

                      Dann nimm den Amiga.
                      Nein, ich meine das durchaus ernst.

                      Och nöööö ... ;) Ich will doch unsere Datenbank endlich von dem "toten System" wegkriegen ....

                      Danke für deine vielen Vorschläge.
                      Das muß ich mir jetzt erstmal zu Gemüte führen (und verstehen auch noch ;)
                      Mannomann .. wasn Schiieetkraaam ...

                      Merci, Walter

                    2. Jaaaaaaaaa ....... Hurrrrraaaaa!
                      Es geht!

                      function convert_text() machts !

                      Mensch Christoph .. du machst dir keine Vorstellung, was für
                      ein Riesen Stein mir vom Herzen fällt. Ohne Druckfunktion hätte
                      ich das "Ding" vergessen können.
                      Schade, daß wir hier so virtuell sind, sonst würd ich sofort einen ausgeben.

                      Ich danke dir, für deine Geduld und dein Engagement.

                      Schönen Gruß aus der Welt der Anfänger,
                      Walter

      2. Hallo, Walter,

        wahrscheinlich ist dir durch Zufall noch kein ß und noch nicht die großen Umlaute ÄÖÜ untergekommen, die dürften auch Probleme bereiten.

        Du hast also einen Drucker, von dem du nicht genau weisst, wie er die ASCII-Codes ( 032 - 255 ) darstellt.

        Und du hast eine Datenbank und ein Programm, von denen du nicht genau weisst, welche ASCII-Codes sie verwalten und von sich geben.

        Folgender Lösungsansatz sollte helfen:
        Erzeuge dir per PHP-Programm alle ASCII-Codes ab 032 (Leerzeichen) und schicke sie an den Drucker (aber nicht die Steuerzeichen unter 032).

        Ordne sie so an, dass du den ASCII-Code der gedruckten Zeichen ablesen kannst, etwa so:

        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
        030 . .   !
        050                               A B C D E
        ..
        250

        Ich glaube 033 ist das !, 065 das A usw. So erfährst du, welchen ASCII-Code der Drucker für die Umlaute möchte.

        Viel Spaß gibt es dann, wenn der Zeichensatz des Druckers durch ein anderes Programm umgestellt wird ...

        Jaja, die Umlaute ...

        LG Kalle

        1. Hallo Kalle

          Jaja, die Umlaute ...

          Jaja, genau selbige ...
          Danke für deinen Tip ... werde probieren!
          Bitte bleib an dem Thread dran .. ich brauche die Lösung dringend.

        2. Hallo, Walter & Kalle,

          die ASCII-Codes ( 032 - 255 )

          Es gibt keine ASCII-Codes 128 - 255.
          Demzufolge auch kein Problem mit ASCII-Zeichen 252. ;-)

          ASCII ist 7 bit (0 - 127). Guckst du http://de.selfhtml.org/inter/sprache.htm

          Gunnar

          --
          „Solang wir noch tanzen können
          und richtig echte Tränen flennen,
          ist noch alles offen,
          ist noch alles drin.“
          (Gundermann)
      3. Hallo Christoph, hallo Kalle!

        Also .. beide Vorschläge durchgeführt.
        Ging nicht schneller .. mensch muss auch noch andere Sachen machen;)

        Wenn Du händisch eine Datei erstellst ...

        'TYPE datei >lpt1' ausdrucken läßt, kommt dann das Richtige 'raus?

        Nein .. (siehe unten)

        »»Folgender Lösungsansatz sollte helfen:
          Erzeuge dir per PHP-Programm alle ASCII-Codes ab 032 (Leerzeichen)und schicke sie an den Drucker ...

        .. und der zeigt zum Beispiel ...
        fürs "kleine ü" : ascii252->ein "hochgestelltes n".
        fürs "kleine ä" : ascii228->ein "griech.Sigma".
        fürs "kleine ö" : ascii246->ein "waagrechter Strich mit Punkt drüber und drunter".

        Hmm ... könnt ihr daraus jetzt etwas ersehen?

        Gruß vom Walter