Encoding-Problem beim TelegramBot

Begonnen von Prof. Dr. Peter Henning, 08 Januar 2023, 16:41:01

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

Bisher hatte ich meinen TelegramBot auf einem Extra-Pi laufen, und habe problemlos mit einem Remote-Kommando Nachrichten senden können.

Ich habe den TelegramBot jetzt auf eines meiner beiden Hauptsysteme (Mini-PC) umgezogen, und natürlich alle Routinen angepasst.

Auf diesem Hauptsystem läuft auch meine ganze Sprachverarbeitung - mit Eingaben über Tablets, Auswertung über Babble und ChatBot und Ausgabe entweder über Audiodevices (mit Amazon Polly und vorgefertigten Speechlets) oder über den TelegramBot.

So kann ich problemlos die kompliziertesten Textnachrichten als Sprachausgabe hören, oder mir per Telegram schicken lassen.

Denkste.

Die Audioausgabe via Telegram klappt nach wie vor prima - aber seit dem Umzug machen Textnachrichten mit Umlauten Probleme.

Beispiel: Meine Sprachverarbeitung antwortet auf die Frage "Wie geht es dir" mit der Nachricht
ZitatDas Haus ist nicht Gesichert und im Modus Normal. Es ist Tageszeit, letzter Übergang war vor Sonnenuntergang.

Die Nachricht, sagen wir mal, in der Variablen $text, enthält ein "Ü" - und daran scheitert der TelegramBot.

Das Kommando
Zitatfhem("set TelegramBot reply $NachrichtenId $text")
wird zwar ausgeführt, aber führt zu einer Fehlermeldung des Bots
ZitatNonBlockingGet timed out on read ... after 30s

Ersetzt man das "Ü" durch einen Nicht-Umlaut, klappt alles.

So, jetzt wirds unlustig. Denn das Kommando
Zitatfhem("set TelegramBot reply $NachrichtenId Das Haus ist nicht Gesichert und im Modus Normal. Es ist Tageszeit, letzter Übergang war vor Sonnenuntergang.")
wird problemlos ohne Fehlermeldung abgearbeitet. Also war natürlich die Vermutung, dass das Umlaut-Encoding in $text nicht stimmte.

Falsch. Binärer Wert für Ü ist sowohl bei der Verwendung des Literals als auch bei Verwendung der Variablen $text ist \xc3\xc9 - das ist das UTF-8-Encoding für "Ü".

Also habe ich alle Möglichkeiten in Perl ausprobiert: Modul Encode, Modul Text::Iconv, hin- und her, Latin-1, UTF-8, UTF-16, Unicode. Ohne Erfolg.

Also habe ich noch einen Trick ausprobiert. Nämlich den Versand über den TelegramBot nicht direkt aus meinen Sprachausgaberoutinen durchzuführen. Sondern daraus ein "at" zu generieren:
Zitatdefmod TelegramLater at +00:00:01 set TelegramBot reply <hier MsgId> Das Haus ist nicht Gesichert und im Modus Normal. Es ist Tageszeit, letzter Übergang war vor Sonnenuntergang.

Ergebnis bei automatischer Generierung des at: at wird ausgeführt, TelegramBot wird ausgeführt, endet aber mit Fehlermeldung wie oben.

Ergebnis bei manueller Generierung des at durch Kopieren der automatischen Definition (!) im Browser (!!): at wird ausgeführt, TelegramBot wird ausgeführt, Nachricht kommt an.

Nach einem ganzen Tag des Experimentierens sind mir jetzt die Ideen ausgegangen. Hat jemand einen Rat für mich?

LG

pah

JoWiemann

Hallo pah,

es gibt ja folgenden Hinweis in der commandRef:
utf8Special 0 / 1 Specify if utf8 encodings will be resolved before sending to avoid issues with timeout on HTTP send (experimental ! / default is off).

Im Code findet man noch folgenden Hinweis (Zeile 1977):


    # if utf8 is set on string this will lead to length wrongly calculated in HTTPUtils (char instead of bytes) for some installations
    if ( ( AttrVal($name,'utf8Special',0) ) && ( utf8::is_utf8($hash->{HU_DO_PARAMS}->{data}) ) ) {
      Log3 $name, 4, "TelegramBot_SendIt $name: utf8 encoding for data in message ";
      utf8::downgrade($hash->{HU_DO_PARAMS}->{data});
#      $hash->{HU_DO_PARAMS}->{data} = encode_utf8($hash->{HU_DO_PARAMS}->{data});
    }


Eventuell ist das ja ein Hinweis auf Dein Problem.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

CoolTux

Zitat von: JoWiemann am 08 Januar 2023, 18:05:22
Hallo pah,

es gibt ja folgenden Hinweis in der commandRef:
utf8Special 0 / 1 Specify if utf8 encodings will be resolved before sending to avoid issues with timeout on HTTP send (experimental ! / default is off).

Im Code findet man noch folgenden Hinweis (Zeile 1977):


    # if utf8 is set on string this will lead to length wrongly calculated in HTTPUtils (char instead of bytes) for some installations
    if ( ( AttrVal($name,'utf8Special',0) ) && ( utf8::is_utf8($hash->{HU_DO_PARAMS}->{data}) ) ) {
      Log3 $name, 4, "TelegramBot_SendIt $name: utf8 encoding for data in message ";
      utf8::downgrade($hash->{HU_DO_PARAMS}->{data});
#      $hash->{HU_DO_PARAMS}->{data} = encode_utf8($hash->{HU_DO_PARAMS}->{data});
    }


Eventuell ist das ja ein Hinweis auf Dein Problem.

Grüße Jörg

Na das ist doch genau mein Problem was ich vor kurzem hatte und immer noch habe.

https://forum.fhem.de/index.php/topic,131207.msg1254261.html#msg1254261
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Prof. Dr. Peter Henning

Sieh an, ich bin also doch kein Versager...

Mal sehen, ob ich aus dem Wust irgendetwas machen kann, danke für die Hinweise.

LG

pah

Prof. Dr. Peter Henning

#4
OK, gelöst.

Erster Punkt war tatsächlich, dass die Locale nicht korrekt auf de_DE.utf8 stand => behoben.

Dann ohne das TelegramBot-Attribut utfspecial wenigstens eine kompetente Fehlermeldung:

Zitat2023.01.10 16:05:48 1: PERL WARNING: substr outside of string at /opt/fhem/FHEM/HttpUtils.pm line 752.
2023.01.10 16:05:48 1: PERL WARNING: Use of uninitialized value $data in numeric eq (==) at /opt/fhem/FHEM/HttpUtils.pm line 753.

Also gesetzt attr TelegramBot utfspecial 1

==> Text mit Umlauten wird korrekt gesendet.

Danke Euch.

LG

pah

Ich lass das Thema aber mal offen, weil mir das mit dem "utfspecial" wie ein Workaround vorkommt.