UTF8 Problem

  • C#

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    UTF8 Problem

    Hallo, ich habe ein großes problem.
    Ich habe ein Code geschrieben um manche Wörter zu sperren die in der Datenbank eingetragen sind.
    Mein Problem: Wenn z.B. das Wort: Hallo gesperrt ist, ist Halló gesperrt aber wenn ich HallÒ schreibe kommt es durch. Und wenn ich HÀllo schreibe wird es auch gefiltert und kommt nicht durch. Meine Frage, wieso werden die Wörter mit großes Ò nicht blockiert aber die kleinen mit ó werden blockiert wie es sein soll.

    Hier der Code:

    C#-Quellcode

    1. {
    2. public class AntiAd
    3. {
    4. public List<string> IllegalWords = new List<string>();
    5. public AntiAd()
    6. {
    7. IllegalWords.Clear();
    8. using (DatabaseClient dbClient = GoldTree.GetDatabase().GetClient())
    9. {
    10. DataTable dt1 = dbClient.ReadDataTable("SELECT * FROM wordfilter");
    11. foreach (DataRow dr in dt1.Rows)
    12. {
    13. IllegalWords.Add((string)dr["word"]);
    14. }
    15. }
    16. }
    17. public void Refresh()
    18. {
    19. IllegalWords.Clear();
    20. using (DatabaseClient dbClient = GoldTree.GetDatabase().GetClient())
    21. {
    22. DataTable dt1 = dbClient.ReadDataTable("SELECT * FROM wordfilter");
    23. foreach (DataRow dr in dt1.Rows)
    24. {
    25. IllegalWords.Add((string)dr["word"]);
    26. }
    27. }
    28. }
    29. public bool ContainsIllegalWord(string t)
    30. {
    31. string s = Utf8ToUtf16(t).ToLower();
    32. string txt = s.Replace("+", "").Replace(" ", "").Replace("|", "").Replace("?", "").Replace("/", "").Replace("'", "").Replace('"'.ToString(), "");
    33. string txt1 = txt.Replace("*", "").Replace("~", "").Replace("(", "").Replace(")", "").Replace("=", "").Replace("&", "").Replace("§", "").Replace(",", "").Replace("[", "").Replace("^", "").Replace("´", "").Replace("`", "").Replace("_", "").Replace("°", "");
    34. string txt3 = txt1.Replace("û", "u").Replace("ú", "u").Replace("ù", "u").Replace("â", "a").Replace("á", "a").Replace("à", "a").Replace("@", "a").Replace("ô", "O").Replace("ó", "o").Replace("ò", "o").Replace("ê", "e").Replace("é", "e").Replace("è", "e").Replace("$", "s").Replace("€", "e").Replace("î", "i").Replace("í", "i").Replace("ì", "i");
    35. string txt2 = txt3.Replace("!", "").Replace("?", "").Replace(":", "").Replace("-", "").Replace(";", "").Replace("<", "").Replace(">", "").Replace("$", "").Replace("#", "").Replace("¦", "").Replace("}", "").Replace("{", "").Replace("]", "");
    36. string txt4 = txt2.Replace("ä", "a").Replace("ü", "u").Replace("ö", "o").Replace("ë", "e").Replace("ï", "i").Replace("ÿ", "y");
    37. string txt5 = txt4.Replace(".", "").Replace("-", "").Replace("3", "").Replace("Ø", "");
    38. foreach (string word in IllegalWords)
    39. {
    40. string word2 = word.ToLower();
    41. if (txt5.Contains(word2) || txt4.Contains(word2))
    42. {
    43. return true;
    44. }
    45. }
    46. return false;
    47. }
    48. private static string Utf8ToUtf16(string utf8String)
    49. {
    50. List<byte> list = new List<byte>(utf8String.Length);
    51. for (int i = 0; i < utf8String.Length; i++)
    52. {
    53. byte b = (byte)utf8String[i];
    54. if (b > 0)
    55. {
    56. list.Add(b);
    57. }
    58. }
    59. return Encoding.UTF8.GetString(list.ToArray());
    60. }
    61. }
    62. }


    Was habe ich falsch gemacht das ó gefiltert wird bzw. gesperrt wie es auch sein soll, aber Ò nicht gesperrt wird ?
    Ich bitte um Hilfe, danke.

    Mit freundlichen Grüßen
    Willkommen im Forum. :thumbup:

    VB-Neuling schrieb:

    C#-Quellcode

    1. string s = Utf8ToUtf16(t).ToLower();
    Zunächst würde ich den Text in solch einem Encoding darstellen, dass die wenigsten Replace-Operationen durchgeführt werden müssen.
    Die Konvertierung zwischen Byte und String findest Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bitte entferne das unnütze Vollzitat aus Deinem 2. Post.

    VB-Neuling schrieb:

    an meinem Code
    machst Du dies:

    VB.NET-Quellcode

    1. public bool ContainsIllegalWord(string t)
    2. {
    3. string txt = Utf8ToUtf16(t.ToLower());
    4. txt = txt.Replace("+", "").Replace(" ", "").Replace("|", "").Replace("?", "").Replace("/", "").Replace("'", "").Replace('"'.ToString(), "");
    5. txt = txt.Replace("*", "").Replace("~", "").Replace("(", "").Replace(")", "").Replace("=", "").Replace("&", "").Replace("§", "").Replace(",", "").Replace("[", "").Replace("^", "").Replace("´", "").Replace("`", "").Replace("_", "").Replace("°", "");
    6. txt = txt.Replace("û", "u").Replace("ú", "u").Replace("ù", "u").Replace("â", "a").Replace("á", "a").Replace("à", "a").Replace("@", "a").Replace("ô", "O").Replace("ó", "o").Replace("ò", "o").Replace("ê", "e").Replace("é", "e").Replace("è", "e").Replace("$", "s").Replace("€", "e").Replace("î", "i").Replace("í", "i").Replace("ì", "i");
    7. txt = txt.Replace("!", "").Replace("?", "").Replace(":", "").Replace("-", "").Replace(";", "").Replace("<", "").Replace(">", "").Replace("$", "").Replace("#", "").Replace("¦", "").Replace("}", "").Replace("{", "").Replace("]", "");
    8. txt = txt.Replace("ä", "a").Replace("ü", "u").Replace("ö", "o").Replace("ë", "e").Replace("ï", "i").Replace("ÿ", "y");
    9. txt = txt.Replace(".", "").Replace("-", "").Replace("3", "").Replace("Ø", "");
    10. foreach (string word in IllegalWords)
    11. {
    12. string word2 = word.ToLower();
    13. if (txt.Contains(word2))
    14. {
    15. return true;
    16. }
    17. }
    18. return false;
    19. }
    20. private static string Utf8ToUtf16(string utf8String)
    21. {
    22. List<byte> list = new List<byte>();
    23. foreach (byte b in StringToByteArray(utf8String))
    24. {
    25. if (b > 0) // hier ggf. (b >= 32) // Space
    26. {
    27. list.Add(b);
    28. }
    29. }
    30. return ByteArrayToString(list.ToArray());
    31. }
    32. private static byte[] StringToByteArray(string str)
    33. {
    34. System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
    35. return enc.GetBytes(str);
    36. }
    37. private static string ByteArrayToString(byte[] arr)
    38. {
    39. System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
    40. return enc.GetString(arr);
    41. }
    Leider kann ich den Code nicht testen, da mir geeignete Testdaten fehlen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Jetzt funktioniert die Filterung nicht mehr richtig leider. Ich kann jetzt Hállo schreiben. Also ich kann jetzt buchstaben wie À Ò é etc. benutzen. Das sollte eigentlich wie vorhin auch gesperrt sein, nur das dass Ò nicht gesperrt wurde leider.
    Fang doch erstmal damit an die ganzen Replace anweisungen in eine Schleife zu packen. Den Code kannste so wie erst nämlich sowieso nicht lesen.
    Kannste z.B. nen ListOf Tuple machen, dort alle Buchstaben reinpacken die ersetzt werden sollen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Kann man das nicht anders regeln ?
    Es werden nur nicht die buchstaben wie: À Ù Ò È erkannt. Also die buchstaben á ú ó é werden nur klein gesperrt, groß werden die leider nicht gesperrt und kommen im Chat durch was nicht so sein soll, die sollen nähmlich groß geschrieben auch gesperrt sein.

    Vollzitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Eierlein schrieb:

    Es werden nur nicht die buchstaben wie: À Ù Ò È erkannt.

    Als Abhilfe würde ich erstmal die Großbuchstaben replacen.

    Quellcode

    1. .Replace("À", "A")
    2. usw.


    Das ist ja das problem, ich hatte schon mal .Replace("Ò", "O") etc. eingetragen. Wenn ich dann aber das Wort mit Ò schreibe kommt es trotzdem durch und wird nicht blockiert, wie bei wenn ich es klein schreiben würde.

    RodFromGermany schrieb:

    Leider kann ich den Code nicht testen, da mir geeignete Testdaten fehlen.
    Poste einen relevanten Test-Text und dessen Soll-Output.
    Dann sehen wir weiter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also hier noch mal mein ganzen Code;

    C#-Quellcode

    1. using MySql.Data.MySqlClient;
    2. using System;
    3. using System.Data;
    4. using System.Collections.Generic;
    5. using System.Security.Cryptography;
    6. using System.Text;
    7. using GoldTree.Core;
    8. using GoldTree.Test;
    9. using GoldTree.Net;
    10. using GoldTree.Storage;
    11. using GoldTree.Util;
    12. using GoldTree.Communication;
    13. using GoldTree.Messages;
    14. using System.Net;
    15. using System.IO;
    16. using System.Globalization;
    17. namespace GoldTree.AntiAd
    18. {
    19. public class AntiAd
    20. {
    21. public List<string> IllegalWords = new List<string>();
    22. public AntiAd()
    23. {
    24. IllegalWords.Clear();
    25. using (DatabaseClient dbClient = GoldTree.GetDatabase().GetClient())
    26. {
    27. DataTable dt1 = dbClient.ReadDataTable("SELECT * FROM wordfilter");
    28. foreach (DataRow dr in dt1.Rows)
    29. {
    30. IllegalWords.Add((string)dr["word"]);
    31. }
    32. }
    33. }
    34. public void Refresh()
    35. {
    36. IllegalWords.Clear();
    37. using (DatabaseClient dbClient = GoldTree.GetDatabase().GetClient())
    38. {
    39. DataTable dt1 = dbClient.ReadDataTable("SELECT * FROM wordfilter");
    40. foreach (DataRow dr in dt1.Rows)
    41. {
    42. IllegalWords.Add((string)dr["word"]);
    43. }
    44. }
    45. }
    46. public bool ContainsIllegalWord(string t)
    47. {
    48. string s = Utf8ToUtf16(t).ToLower();
    49. string txt = s.Replace("+", "").Replace(" ", "").Replace("•", "").Replace("?", "").Replace("/", "").Replace("'", "").Replace('"'.ToString(), "");
    50. string txt1 = txt.Replace("*", "").Replace("~", "").Replace("(", "").Replace(")", "").Replace("=", "").Replace("&", "").Replace("§", "").Replace(",", "").Replace("[", "").Replace("^", "").Replace("´", "").Replace("`", "").Replace("_", "").Replace("°", "");
    51. string txt3 = txt1.Replace("û", "u").Replace("ú", "u").Replace("ù", "u").Replace("â", "a").Replace("á", "a").Replace("à", "a").Replace("@", "a").Replace("ô", "o").Replace("ó", "o").Replace("ò", "o").Replace("ê", "e").Replace("é", "e").Replace("è", "e").Replace("$", "s").Replace("€", "e").Replace("î", "i").Replace("í", "i").Replace("ì", "i");
    52. string txt2 = txt3.Replace("!", "").Replace("?", "").Replace(":", "").Replace("-", "").Replace(";", "").Replace("<", "").Replace(">", "").Replace("$", "").Replace("#", "").Replace("¦", "").Replace("}", "").Replace("{", "").Replace("]", "");
    53. string txt4 = txt2.Replace("ä", "a").Replace("ü", "u").Replace("ö", "o").Replace("ë", "e").Replace("ï", "i").Replace("ÿ", "y");
    54. string txt5 = txt4.Replace("Ò", "O").Replace("-","");
    55. foreach (string word in IllegalWords)
    56. {
    57. string word2 = word.ToLower();
    58. if (txt5.Contains(word2) || txt4.Contains(word2))
    59. {
    60. return true;
    61. }
    62. }
    63. return false;
    64. }
    65. private static string Utf8ToUtf16(string utf8String)
    66. {
    67. List<byte> list = new List<byte>(utf8String.Length);
    68. for (int i = 0; i < utf8String.Length; i++)
    69. {
    70. byte b = (byte)utf8String[i];
    71. if (b > 0)
    72. {
    73. list.Add(b);
    74. }
    75. }
    76. return Encoding.UTF8.GetString(list.ToArray());
    77. }
    78. }
    79. }


    Mein problem ist es, das groß geschriebene wörter mit È Ò Ù etc. nicht gefiltert werden sie es eigentlich sollten. Wenn ich die wörter klein schreibe mit é ó ú ist es kein problem und es funktioniert. Was genau muss ich jetzt am Code ändern das es funktioniert, aber trotzdem weiterhin auch Sonderzeichen (Alt Codes) gefiltert werden ? Ich bitte um Hilfe, vielen Dank.

    VB-Neuling schrieb:

    Mein problem ist

    RodFromGermany schrieb:

    Poste einen relevanten Test-Text und dessen Soll-Output.
    Poste Beispieltexte, keinen Code, den haben wir schon :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Beispieltexte:

    BABBÒ - > geschrieben im Chat , kommt durch und wird nicht blockiert.
    BabbÒ -> geschrieben im Chat , kommt durch und wird nicht blockiert. (Wie es nicht sein soll) Geschrieben mit großem Ò wird leider nicht blockiert was falsch ist.
    Babbó -> geschrieben im Chat, kommt nicht durch und wird blockiert wie es sein soll. Geschrieben mit kleinem ó wird blockiert, was richtig ist.
    B|a|b|b|o geschrieben mit Alt-Codes dazwischen , wird blockiert und kommt nicht durch wie es sein soll.
    B•a•b•b•o geschrieben mit einem anderen Alt-Code, wird nicht blockiert und kommt leider durch. Alt-Code: • wird also auch nicht blockiert, wie die buchstaben Ù È Ò in groß geschrieben.

    VB-Neuling schrieb:

    Beispieltexte
    Ich kenne Deine Datenbank nicht, für die Umformatierung ist sie nicht von Belang.
    Bei mir werden die Texte jedenfalls ordentlich umgerubelt.
    Und:
    Sieh Dir mal meinen Code in Post #4 an.
    Bilder
    • babbo.png

      10,41 kB, 300×147, 91 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja bei mir gehts darum das die Wörter mit großem Ò gesperrt werden wie die mit kleinen ó. Mit kleinem ó werden die wörter automatisch gesperrt und nicht abgeschickt, aber bei Ò wird es nicht gesperrt und wird leider abgeschickt.


    Unnötiges Vollzitat entfernt
    -Artentus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    VB-Neuling schrieb:

    Ja bei mir gehts darum das
    das Inhalt der Datenbank ist.
    Wenn nach dem Umrubeln ein DB-Wort herauskommt, funktioniert das. Wenn nicht, musst Du Dir die Datenbank oder das Umrubeln ansehen.
    Schreib vorher auf, was rauskommen soll, dann vergleiche, was passiert.
    Setz einen Haltepunkt in die 1. Zeile, führe den Code schrittweise aus und verfolge den Inhalt der Variablen. Wenn Du einen Unterschied zwischen Soll und Ist gefunden hast, hast Du einen Fehler gefunden.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!