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
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
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
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
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.
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);
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
:) Danke und ebenso zurück.
Bis denne !