Löschen von chars die nicht "normale" Zeichen sind

  • C#
  • .NET (FX) 4.0

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von imho74.

    Löschen von chars die nicht "normale" Zeichen sind

    Hi Leute,

    ich habe ein ziemliches Problem. Ich habe hier eine Datenbank (MySQL) die als Collation und Charset utf8 hat. Wie wir alle wissen ist bei MySQL utf8 != UTF8 (Man brauch utf8mb4_unicode_ci für echtes UTF8). Dies bedeutet, dass nun von einer App aus Emoji in die Datenbank strömen, diese jedoch nur einen Fehler zurückgibt, da diese Zeichen nicht unterstüzt werden. Nun stehe ich vor der geradezu heroischen Aufgabe auf der einen Seite eine schnelle Lösung zu finden, um die Emoji aus den übergebenen Daten herauszufiltern, auf der anderen Seite muss ich jedoch den einfachst möglichen weg finden 180 Tabellen mittelfristig mit dem echten utf8 kompatibel zu machen, am besten vollautomatisch. Letzteres ist jedoch ein Thema für eine andere Zeit.

    Nun also zur Frage, wie filtere ich Emojis und alles andere aus Strings heraus, was nicht der definition von utf8 in MySQL entspricht, ohne dabei zu restirktiv zu sein? Ich habe mir schon überlegt, z.B. nur Alle Zeichen auf der Tastatur zuzulassen, die gerade vor mir liegt, jedoch würde ich dann schon viele europäische Nachbarn verlieren, geschweige denn den rest der Welt. Dann dachte ich mir, ich könnte ja vielleicht MySQL darum fragen, welche Zeichen nun erlaubt sind, lasse mir also eine Liste an erlaubten Zeichen zurückgeben, doch ich finde nirgends im web auch nur eine einfache Tabelle mit den Zeichen die erlaubt sind. Zuletzt habe ich mir gedacht ich könnte ja versuchen einfach den "Emoji-Raum" in Unicode mit String.Empty zu replacen, doch leider sind Emoji mit deren Skinttone- und Gendermodifier (und was es noch so gibt) 3 oder mehr Zeichen lang, und ich habe nicht gerade vor dafür einen Algo zu schreiben der das erkennt, zumal ich davon eh keine Ahnung habe. Wie würdet ihr da nun am besten vorgehen?
    Hallo,

    vielleicht ist die Antwort zu spät, aber kennst du vielleicht "GetUnicodeCategory"? Im Beispiel-Code wird Linq benutzt, um alle chars in ein Array zu schreiben, die nicht unter der Kategorie "OtherSymbol"​ fallen:

    C#-Quellcode

    1. using System;
    2. using System.Linq;
    3. namespace EmojiSample
    4. {
    5. class Program
    6. {
    7. static void Main(string[] args)
    8. {
    9. string sText = "look into my eyes 〠.〠";
    10. Console.WriteLine(char.GetUnicodeCategory('a'));
    11. Console.WriteLine(char.GetUnicodeCategory('〠'));
    12. sText = new string(sText.Where(x => !(char.GetUnicodeCategory(x).ToString() == "OtherSymbol")).ToArray());
    13. Console.WriteLine(sText);
    14. Console.ReadKey();
    15. }
    16. }
    17. }


    Viele Grüße
    ​Christian
    Danke für deine Antzwort, ich hatte völlig vergessen, hier meine Lösung zu posten:

    C#-Quellcode

    1. private string ReplaceEmoji(string text)
    2. {
    3. if (string.IsNullOrWhiteSpace(text))
    4. {
    5. return text;
    6. }
    7. return Regex.Replace(text, @"[^\u0000-\u0FFF]+", ""); //Einfach ab einem bestimmten Bereich abschneiden
    8. }


    Jetzt noch ein Paar fragen zu deiner Lösung @imho74:
    Fallen alle Emojis in diese Kategorie? Oder gibt es welche die davon ausgeschlossen sind?
    Gibt es andere Zeichen die davon ebenfalls betroffen sind?
    Hallo EaranMaleasi,

    EaranMaleasi schrieb:


    Fallen alle Emojis in diese Kategorie? Oder gibt es welche die davon ausgeschlossen sind?
    Gibt es andere Zeichen die davon ebenfalls betroffen sind?


    Der Nachteil meiner Lösung ist, dass die GetUnicodeCategory-Methode zu Char gehört , also fallen Emojis weg, die UTF-16 oder größer sind, also mehr als "1" Zeichen haben. Andere Zeichen werden sonst ganz gut erkannt, wie CurrencySymbol oder OtherPunctuation etc.

    Eine Idee, die ich noch hätte wären Surrogate zu identifizieren, wenn man den String in ein Char-Array packt und sich das 1. Zeichen anguckt:

    C#-Quellcode

    1. char[] myChar = ":)".ToCharArray();
    2. Console.WriteLine(char.GetUnicodeCategory(myChar[0]));
    3. // Output: Surrogate
    4. char[] myNextChar = "AA".ToCharArray();
    5. Console.WriteLine(char.GetUnicodeCategory(myNextChar[0]));
    6. // Output: UppercaseLetter


    Ich weiß jetzt aber nicht, wie gut das klappt.

    Edit:
    Die Zeile mit dem Smily will nicht, wie ich will X( :
    char[] myChar = "<Hier soll ein Smily von Wingdings o.ä. stehen, bekomme ich aber leider nicht ins Forum eingefügt.>".ToCharArray();

    Ich versuche noch ein Foto nachzureichen. :D

    Viele Grüße
    Christian

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „imho74“ ()