FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Carsten am 23 Juli 2015, 23:15:23

Titel: [gelöst] Mit Perl Regex nach Unicode Zeichen (Emoticon) suchen?
Beitrag von: Carsten am 23 Juli 2015, 23:15:23
Hallo,

ich benutze das yowsup-Modul um Whatsapp-Nachrichten zu empfangen und auszuwerten. Das klappt soweit ganz gut.

Ich möchte jetzt aber auch auf bestimmte Emoticons/Smilies/ Symbole reagieren.

Konkret geht es z.B. um das Zeichen "✅" ( WHITE HEAVY CHECK MARK ). Wenn ich das Empfange, wird das sogar im Browser im Reading message angezeigt.

Ich bekomme es aber nicht hin, dass in Perl auszuwerten. So sieht mein aktuelle Versuch aus:

sub
DoOnGroupMsgReceived()
{
  my $msgText=ReadingsVal("WhatsAppGruppe", "message", "" );
  my $CheckMark = "\x{2705}";
 
  #chomp( $msgText );

  if ( $msgText eq $CheckMark ) { #WHITE HEAVY CHECK MARK
    fhem( "set WhatsAppGruppe send Check");
  }

  if ( $msgText =~ /$CheckMark/ ) { #WHITE HEAVY CHECK MARK
    fhem( "set WhatsAppGruppe send Check");
  }
 
}


Es gibt aber nie ein Match, obwohl eben genau das Zeichen in message steht. Mit normalen Buchstaben gehts.
Ich vermute, dass ich irgendwie jedes Byte mit einem 2Byte-Zeichen vergleiche und deswegen nie ein Match finde, aber ich habe langsam keine Idee mehr, wie man das löst oder wonach ich überhaupt googlen könnte.

Hat jemand eine Idee?

Viele Grüße

Carsten




Titel: Antw:Mit Perl Regex nach Unicode Zeichen (Emoticon) suchen?
Beitrag von: justme1968 am 23 Juli 2015, 23:40:09
hast du es mal mit $CheckMark = chr(0xE2) . chr(0x9C) . chr(0x85);

versucht?

gruß
  andre
Titel: Antw:Mit Perl Regex nach Unicode Zeichen (Emoticon) suchen?
Beitrag von: Carsten am 23 Juli 2015, 23:49:25
Andre, du bist mal wieder mein persönlicher Held! :-*

Kannst du mir noch kurz erklären, warum das geht? Brauche es noch für 2-3 andere Zeichen.

*edit*
Ach, ich seh schon. UTF8 vs. UTF16, richtig?

Danke nochmal!
Titel: Antw:Mit Perl Regex nach Unicode Zeichen (Emoticon) suchen?
Beitrag von: justme1968 am 24 Juli 2015, 08:43:12
fhem verwendet intern zwar das utf8 endoding aber die strings sind nicht als solche gekennzeichnet sondern nur bytefolgen. deshalb funktioniert das matchen gegen ein 'echtes' utf8 zeichen nicht.

utf8 ist kein 2byte endoding sondern hat eine variable länge. du häufigsten buchstben brauchen sogar nur 1 byte. die seltenen 3 oder 4.

gruß
  andre
Titel: Antw:Mit Perl Regex nach Unicode Zeichen (Emoticon) suchen?
Beitrag von: Carsten am 24 Juli 2015, 10:07:32
Hallo,

das heißt aber, der String "âœ..." chr( 0xE2 ), chr( 0x9C ), chr( 0x85 ) würde auch matchen, oder?

In dem Beispiel jetzt nicht unbedingt ein gebräuchliches Wort  :D, aber das kann für andere Zeichen ja anders aussehen.

Übrigens, wenn ich /x{2705} über yowsup sende gibt es einen Fehler ( ich glaube in syswrite ) und solange das Zeichen noch im Sent-Reading steht, kann ich die Detailseite des Devices nicht mehr aufrufen.
Ist ( zumindest bei mir ) aber kein praktisches Problem, sondern nur beim Rumtesten aufgefallen.
Titel: Antw:Mit Perl Regex nach Unicode Zeichen (Emoticon) suchen?
Beitrag von: justme1968 am 24 Juli 2015, 10:15:13
im prinzip ja. aber das â ist je nach editor selber schon utf8 codiert. bau die strings lieber über die hex werte zusammen.

das problem mit der gegenrichtung kenne ich. ich habe aber noch keine wirklich gute lösung.

gruss
  andre
Titel: Antw:Mit Perl Regex nach Unicode Zeichen (Emoticon) suchen?
Beitrag von: Carsten am 24 Juli 2015, 10:27:45
Zitat von: justme1968 am 24 Juli 2015, 10:15:13
im prinzip ja. aber das â ist je nach editor selber schon utf8 codiert. bau die strings lieber über die hex werte zusammen.
Ich glaub, du hast mich falsch verstanden.
Meine "Sorge" ist, dass jemand in Whatsapp "âœ..." schreibt und ich das dann fälschlich als Checksign erkenne.
In dem Beispiel jetzt eher unwahrscheinlich, aber wenn man Pech hat, ist die Entsprechung "lol" und dann wirds verwirrend.  ;D
Titel: Antw:[gelöst] Mit Perl Regex nach Unicode Zeichen (Emoticon) suchen?
Beitrag von: justme1968 am 24 Juli 2015, 10:40:00
achso :)

nein. das kann nicht passieren weil das â von whatsapp als unicode zeichen gesendet wird und 2 byte lang ist.

gruss
  andre