Hauptmenü

substr und Unicodes?

Begonnen von gestein, 14 Oktober 2020, 09:32:01

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

ich habe da in meinem msgDialog einen String mit einem Unicode am Anfang und muss den String in bearbeiten.
Dazu wollte ich substr nehmen, das klappt aber nicht.

Da ich das ersten Zeichen wegnehmen muss und den Rest in der Funktion GetLights übergeben muss, wollte ich folgenden Funktionsaufruf nehmen:
GetLights(substr($Message,1))
In "$Message"steht z.B. "?Gästezimmer".

Aber ich bekomme folgende Fehlermeldung im Log:
2020.10.14 09:17:22.797 1: ERROR evaluating {GetLights(substr(?Gästezimmer,1))}: Unrecognized character \x{9f}; marked by <-- HERE after s(substr(▒<-- HERE near column 20 at (eval 236647) line 1.

Anscheinend kann substr nicht mit den Unicode umgehen.
Wie muss ich das in fhem richtigerweise machen?

Danke im Voraus
lg, Gerhard

p.s.: Ich kann eigenartigerweise auch hier keine Unicodes im Betrag eingeben. Ich wollte das Lampen-Unicode nehmen und bekomme dann im Forum bei "Vorschau" oder "Schreiben" die folgende Fehlermeldung:
Fehler beim Schreiben des Beitrages.
Textfeld wurde nicht ausgefüllt.

Daher habe ich oben das Lampen-Unicode durch "?" ersetzt.

rob

Hallo Gerhard.

Welches Unicode-Char Du genau meinst, weiß ich zwar nicht, aber hab es mal anhand Smiley nachgestellt. IMHO ist es mehr als 1 Char das Du wegschneiden müsstest.

my $tmp=":) Hallo";
print $tmp;
ergibt -->  :) Hallo

my $tmp=":) Hallo";
print substr($tmp,1);
ergibt --> ��� Hallo

my $tmp=":) Hallo";
print substr($tmp,5);
ergibt --> Hallo

Hoffe dies hilft ein wenig weiter
Viele Grüße
rob

PS: den Unicode-Smiley kann ich hier im Post auch nicht einfügen. Deshalb hab ich zur Verdeutlichung auf Code-Tags verzichtet und den normal verfügbaren Smiley genommen.

gestein

Hallo Rob,

Die Smiley's funktionieren bei mir auch.

Ich habe aber z.B. das Unicode-Zeichen 1181 (von hier http://www.unicode.org/emoji/charts/full-emoji-list.html) in meinen Telegram-Dialogen.
Und die kann ich weder hier im Textfeld verwenden, noch kann ich Strings damit mit substr bearbeiten.

Auf der fhem-Webseite kann ich die Unicodes allerdings bearbeiten/einfügen, löschen, anzeigen.

Ist das vielleicht eine Einstellung in meinem Chrome, die auf einmal geändert wurde?

Sobald ich das Unicode-Zeichen hier im Forum im Textfeld einfüge und auf Vorschau gehe, bekomme ich die Fehlermeldung:
Fehler beim Schreiben des Beitrages.
Textfeld wurde nicht ausgefüllt.


lg, Gerhard

rob

Hallo.

Im Forum kann man wohl keine Unicode-Geschichten direkt reinschreiben. Liegt deshalb nicht an Deinem Beispiel, geht mit anderen auch nich - selbe Meldung.

Ah, OK es kommt via Telegram.
Hattest Du
substr($Message,5);
denn trotzdem mal versucht und damit etwas weiter gespielt (z.B. ,6 oder noch mehr)? 
Meckert er immer, egal wieviel weggeschnitten wird? Wenn ja, muss ich leider passen. Sorry  :(

Ich hab mir mal mit Telegram eine Nachricht selber geschickt und das genannte Zeichen benutzt (siehe Bild).
Bei mir klappt es abzufragen mit:
my $tmp=ReadingsVal("MeinTelegramBot","msgText","");
Log 1, substr($tmp,5);

ergibt --> 2020.10.14 12:48:45 1: Gästezimmer

Viele Grüße
rob

gestein

Vielen Dank für Deine Hilfe.

Ja, dass hatte ich so wie Du probiert. Text mit Unicode-Zeichen am Anfang und mit substr abschneiden.
Dann bekomme ich eben diese die Fehlermeldung:
2020.10.14 09:17:22.797 1: ERROR evaluating {GetLights(substr(?Gästezimmer,1))}: Unrecognized character \x{9f}; marked by <-- HERE after s(substr(▒<-- HERE near column 20 at (eval 236647) line 1.

Allerdings war es schon möglich, die Unicode-Zeichen hier im Forum einzusetzen.
Vielleicht wurde was in der Forum-SW geändert?

Ich frage mal.
Danke Dir.
lg, Gerhard

gestein

Hallo,

Dein Versuch hat mich auf die richtige Spur gebracht.
Wenn ich ein Unicode-Zeichen am Anfang weg haben will, dann muss ich ab dem 4. Zeichen trennen.
substr($meinUnicodeText,4)

Danke, lg, Gerhard

Prof. Dr. Peter Henning

ZitatWenn ich ein Unicode-Zeichen am Anfang weg haben will, dann muss ich ab dem 4. Zeichen trennen.

Das ist in dieser Allgemeinheit einfach falsch.

Erstens muss man den Zeichensatz kennen: Unicode mit 16 Bit oder UCS (=ISO 10646) mit 32 Bit.
Zweitens, und das ist das Wichtigere, muss man die Codierung kennen.  In UTF8 werden einzelnen Zeichen Codes zwischen einem und 4 Byte Länge zugeordnet, je nachdem, aus welchem Segment des Zeichensatzes sie stammen. In UTF16 werden jedem Zeichen eine Zeichenkette von entweder 16 Bit oder 32 Bit zugeordnet, ebenfalls abhängig von der Position des Zeichens im Zeichsatz.

Das bedeutet: Wie viele Bytes ein Zeichen tatsächlich umfasst, hängt wesentlich von den Einstellungen des Betriebssystems ab. Windows verwendet typischerweise UTF16 Little Endian. Und wie Perl die Daten behandelt, kann auch sehr stark variieren. Eine genaue Dokumentation findet man hier:

https://perldoc.perl.org/perluniintro

LG

pah


herrmannj

Perl substr und co behandeln Unicode korrekt wenn utf8 aktiviert und der String richtig als Unicode markiert ist.

gestein

@Pah: Ja, das stimmt und so habe ich es auch nicht gemeint. Daher auch meine Formulierung "Wenn ich ein Unicode-Zeichen am Anfang weg haben will ..."

@hermannj: um ehrlich zu sein, habe ich mir bis dato über die utf8 Aktivierung und die Markierung eines Strings als Unicode keine Gedanken gemacht.

Relativ unbekümmert habe ich die Strings in perl einfach mit den Unicode-Zeichen verwendet, ohne darüber genauer nachzudenken. Hat ja auch einfach funktioniert.
Also z.B.:
my $Test="💡Beleuchtung";

Nun muss ich das Zeichen "💡" entfernen um die Kategorie "Beleuchtung" zu bekommen und da kommen - etwas unerwartet - diese Probleme auf.
Das wollte ich einfach mit einem substr machen:
my $Test2=substr ($Test,1);
Klappt aber nicht, das folgende (bei mir) aber schon:
my $Test2=substr ($Test,4);

Wie ich nun das utf8 in der 99_myUtils.pm aktiviere, muss ich mir mal genauer anschauen.
Mich wundert aber, dass in dem msgDialog-Device die Unicode richtig dargestellt werden, beim Aufruf von substr direkt im Device aber ebenfalls die Fehlermeldung kommt.

Mal schauen, wie ich das richtig ziehen kann.

Danke, lg, Gerhard

herrmannj

Ist leider nicht trivial. Du musst das utf8 flag setzen, dann substr danach das flag wieder löschen weil fhem nicht damit rechnet. Ausnahmen exklusive ::)

gestein

Danke für den Hinweis.

Eines verstehe ich aber gar nicht.
Wenn ich in 99_myUtils.pm an einen String einfach einen Unicode anhänge, wird der in fhem einfach angezeigt.
Wenn ich aber einen Unicode wegnehmen möchte, dann entstehen solche Probleme. Warum?

lg, Gerhard

Prof. Dr. Peter Henning

Weil er beim "Anhängen" umgewandelt wird, das Wegnehmen sich aber auf die umgewandelte Form bezieht.

LG

pah