substr outside of string at FHEM/HttpUtils.pm line 749.

Begonnen von CoolTux, 26 Dezember 2022, 18:22:27

Vorheriges Thema - Nächstes Thema

CoolTux

Hallo,

Per HttpUtils_BlockingGet sende ich im Key param->{data} als value einen JSON String. Darin enthaltenen ist ein Umlaut. Und ich bekomme diese Meldung.

PERL WARNING: substr outside of string at FHEM/HttpUtils.pm line 749.


2022.12.26 18:19:12.810 1: !!!DEBUG - MsgcreateParamRef: {"msgtype":"m.text", "body":"ü"}
2022.12.26 18:19:12.810 1: !!!DEBUG - Def: msg ParamValue: data Resp: {"msgtype":"m.text", "body":"ü"}
2022.12.26 18:19:12.813 1: PERL WARNING: substr outside of string at FHEM/HttpUtils.pm line 749.
2022.12.26 18:19:12.813 1: stacktrace:
2022.12.26 18:19:12.813 1:     main::__ANON__                      called by FHEM/HttpUtils.pm (749)
2022.12.26 18:19:12.813 1:     main::__ANON__                      called by fhem.pl (791)
2022.12.26 18:19:12.813 1: PERL WARNING: Use of uninitialized value $data in numeric eq (==) at FHEM/HttpUtils.pm line 750.
2022.12.26 18:19:12.813 1: stacktrace:
2022.12.26 18:19:12.813 1:     main::__ANON__                      called by FHEM/HttpUtils.pm (750)
2022.12.26 18:19:12.813 1:     main::__ANON__                      called by fhem.pl (791)
2022.12.26 18:19:12.816 1: !!!DEBUG - TOKEN aus Hash: syt_c3lzdGVtbWVzc2FnZV9ib3Q_xYfSISPgBwNmgWOhqeqg_1Nj2ER


Ohne Umlaut ist alles schick.
Wie kann ich da am besten ansetzen? decode_utf8 und encode_utf8 habe ich getestet.


Grüße
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

DS_Starter

Hallo Marco,

ich denke das ist ein Problem der Längenbestimmung eines Strings mit Umlauten.
Ich habe hier etwas gefunden:

http://www.perl-community.de/bat/poard/thread/18550

Zitat
Mit Encode::decode('UTF-8', $zeichenkette) kannst du den String itn Perls internes Formt bringen und dann stimmt length

Es wird ein Beispiel angeführt:


use Encode;

print length('ä'), "\n";
print length Encode::decode("UTF-8", "ä"), "\n";

ergibt:

2
1


Wahrscheinlich müßte es in HttpUtils angepasst werden.
Kannst ja mal probieren das $ret in Zeile 749 vor dem Gebrauch gemäß dem obigen Muster anzupassen.

LG
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

CoolTux

Hallo Heiko,

Danke Dir für die Antwort.
Das scheint es aber noch nicht ganz zu sein.



      my $ret = syswrite $hash->{conn}, $data;
      if(!defined($ret) || $ret <= 0) {
        return if($! == EAGAIN);
        my $err = $!;
        RemoveInternalTimer(\%timerHash);
        HttpUtils_Close($hash);
        return $hash->{callback}($hash, "write error: $err", undef)
      }

      print length($ret), "\n";
        $ret = Encode::decode("UTF-8", "$ret");
        print length($ret), "\n";

      $data = substr($data,$ret);



2022.12.28 10:13:56.835 1: !!!DEBUG - MsgcreateParamRef: {"msgtype":"m.text", "body":"ä"}
2022.12.28 10:13:56.836 1: !!!DEBUG - Def: msg ParamValue: data Resp: {"msgtype":"m.text", "body":"ä"}
3
3
2022.12.28 10:13:56.839 1: PERL WARNING: substr outside of string at FHEM/HttpUtils.pm line 754.
2022.12.28 10:13:56.839 1: stacktrace:
2022.12.28 10:13:56.839 1:     main::__ANON__                      called by FHEM/HttpUtils.pm (754)
2022.12.28 10:13:56.839 1:     main::__ANON__                      called by fhem.pl (791)
2022.12.28 10:13:56.839 1: PERL WARNING: Use of uninitialized value $data in numeric eq (==) at FHEM/HttpUtils.pm line 755.
2022.12.28 10:13:56.839 1: stacktrace:
2022.12.28 10:13:56.839 1:     main::__ANON__                      called by FHEM/HttpUtils.pm (755)
2022.12.28 10:13:56.839 1:     main::__ANON__                      called by fhem.pl (791)





Grüße
Marko
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

DS_Starter

Moin Marco,

ja ich meinte zum Test $ret erstmal manuell um 1 je verwendeten Umlaut zu reduzieren um die Theorie zu prüfen.

syswrite  gibt ja zurück die "number of bytes written on success". Also $ret selbst ist nur eine Zahl.

syswrite müsste m.M. nach selbst die Anzahl in $ret anpassen wenn Umlaute verwendet werden. Vllt. gibt es da eine
Aufrufoption oder ein anderes Verfahren.
Tiefer habe ich mich damit noch nicht befasst.

LG
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

CoolTux

Zitat von: DS_Starter am 28 Dezember 2022, 10:40:12
Moin Marco,

ja ich meinte zum Test $ret erstmal manuell um 1 je verwendeten Umlaut zu reduzieren um die Theorie zu prüfen.

syswrite  gibt ja zurück die "number of bytes written on success". Also $ret selbst ist nur eine Zahl.

syswrite müsste m.M. nach selbst die Anzahl in $ret anpassen wenn Umlaute verwendet werden. Vllt. gibt es da eine
Aufrufoption oder ein anderes Verfahren.
Tiefer habe ich mich damit noch nicht befasst.

LG


Hallo Heiko,

Habe ich auch eben raus gefunden das da in $ref ja selbst nur eine Zahl ist. Ich teste mal die Theorie. Aber eigentlich gab es da bei anderen Modulen ja nie Probleme. Aber ich schaue.
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

DS_Starter

#5
Im Perl Kochbuch habe ich gerade etwas gefunden. Aufruf wäre:


my $ret = syswrite $hash->{conn}, $data, length ($data);


Angepasst auf die Theorie:


my $ret = syswrite $hash->{conn}, $data, length Encode::decode("UTF-8", $data);


Mal probieren ...

Oder es reicht dieser Aufruf schon:


my $ret = syswrite $hash->{conn}, Encode::decode("UTF-8", $data);
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

CoolTux

Danke Dir Heiko,

Hatte das schon soweit drin. Hab nur die Wäsche zwischen durch machen müssen  ;D
Aber super nett das Du mich da unterstützt. Und ja, natürlich geht es jetzt.


Grüße und einen guten Rutsch ins neue Jahr
Marko
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

DS_Starter

ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter