|     using System; | 
|     using System.Collections.Generic; | 
|     using System.Text.RegularExpressions; | 
|     using UnityEngine; | 
|     using System.Threading; | 
|   | 
|     public partial class DirtyWordConfig : ConfigBase<int, DirtyWordConfig> | 
|     { | 
|   | 
|         private static WordGroup[] DIRTYWORLD = new WordGroup[(int)char.MaxValue]; | 
|   | 
|         private static List<string> memoryList = new List<string>(); | 
|   | 
|         private static bool dirtyWordInited = false; | 
|   | 
|         static int cursor = 0; | 
|   | 
|         static int wordlenght = 0; | 
|   | 
|         static int nextCursor = 0; | 
|   | 
|         protected override void OnConfigParseCompleted() | 
|         { | 
|             base.OnConfigParseCompleted(); | 
|             if (string.IsNullOrEmpty(word)) | 
|             { | 
|                 Debug.LogErrorFormat("屏蔽字 id = {0} 的内容为空 需要修改", id); | 
|                 return; | 
|             } | 
|             var tmpword = word.Replace(" ", ""); | 
|             string key = ToDBC(tmpword); | 
|             memoryList.Add(key); | 
|         } | 
|   | 
|         private static string ToDBC(string input) | 
|         { | 
|             char[] c = input.ToCharArray(); | 
|             for (int i = 0; i < c.Length; i++) | 
|             { | 
|                 if (c[i] == 12288) | 
|                 { | 
|                     c[i] = (char)32; | 
|                     continue; | 
|                 } | 
|                 if (c[i] > 65280 && c[i] < 65375) | 
|                     c[i] = (char)(c[i] - 65248); | 
|             } | 
|             return new string(c).ToLower(); | 
|         } | 
|   | 
|         public static string IsDirtWord(string source, char filter) | 
|         { | 
|             if (source != string.Empty) | 
|             { | 
|                 cursor = 0; | 
|                 nextCursor = 0; | 
|                 char[] temp = source.ToCharArray(); | 
|                 source = FitterSpecial(source); | 
|                 for (int i = 0; i < source.Length; i++) | 
|                 { | 
|                     //查询以该字为首字符的词组 | 
|                     WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]]; | 
|                     if (group != null) | 
|                     { | 
|                         for (int z = 0; z < group.Count(); z++) | 
|                         { | 
|                             string word = group.GetWord(z); | 
|                             if (word.Length == 0 || Check(word, source)) | 
|                             { | 
|                                 string blackword = string.Empty; | 
|                                 for (int pos = 0; pos < wordlenght + 1; pos++) | 
|                                 { | 
|                                     try | 
|                                     { | 
|                                         blackword += temp[pos + cursor].ToString(); | 
|                                         temp[pos + cursor] = filter; | 
|                                     } | 
|                                     catch (Exception e) | 
|                                     { | 
|                                         Debug.Log(e.Message); | 
|                                     } | 
|                                 } | 
|                                 cursor = cursor + wordlenght; | 
|                                 i = i + wordlenght; | 
|   | 
|                             } | 
|                         } | 
|                     } | 
|                     cursor++; | 
|                 } | 
|                 return new string(temp); | 
|             } | 
|             return string.Empty; | 
|         } | 
|   | 
|         public static bool IsDirtWord(string source) | 
|         { | 
|             if (System.Text.Encoding.UTF8.GetByteCount(source) == 1) | 
|                 return false; | 
|   | 
|             if (source != string.Empty) | 
|             { | 
|                 cursor = 0; | 
|                 nextCursor = 0; | 
|                 for (int i = 0; i < source.Length; i++) | 
|                 { | 
|                     //查询以该字为首字符的词组 | 
|                     WordGroup group = DIRTYWORLD[(int)ToDBC(source)[i]]; | 
|                     if (group != null) | 
|                     { | 
|                         for (int z = 0; z < group.Count(); z++) | 
|                         { | 
|                             string word = group.GetWord(z); | 
|                             if (word.Length == 0 || Check(word, source)) | 
|                             { | 
|                                 return true; | 
|                             } | 
|                         } | 
|                     } | 
|                     cursor++; | 
|                 } | 
|             } | 
|             return false; | 
|         } | 
|   | 
|         private static bool Check(string blackWord, string source) | 
|         { | 
|             wordlenght = 0; | 
|             int wordCnt = 0; | 
|             //检测源下一位游标 | 
|             nextCursor = cursor + 1; | 
|             bool found = false; | 
|             //遍历词的每一位做匹配 | 
|             for (int i = 0; i < blackWord.Length; i++) | 
|             { | 
|                 //特殊字符偏移游标 | 
|                 int offset = 0; | 
|                 if (nextCursor >= source.Length) | 
|                 { | 
|                     break; | 
|                 } | 
|                 else | 
|                 { | 
|                     //检测下位字符如果不是汉字 数字 字符 偏移量加1,,过滤特殊字符 | 
|                     for (int y = nextCursor; y < source.Length; y++) | 
|                     { | 
|                         //if (!IsCHS(source[y]) && !IsNum(source[y]) && !IsAlphabet(source[y])) { | 
|                         if (IsSpecial(source[y])) | 
|                         { | 
|                             offset++; | 
|                             //避让特殊字符,下位游标如果>=字符串长度 跳出 | 
|                             if (nextCursor + offset >= source.Length) break; | 
|                             wordlenght++; | 
|   | 
|                         } | 
|                         else break; | 
|                     } | 
|                     if (nextCursor + offset >= source.Length) | 
|                     { | 
|                         break; | 
|                     } | 
|                     if (blackWord[i] == char.ToLower(source[nextCursor + offset])) | 
|                     { | 
|                         wordCnt++; | 
|                         found = true; | 
|                     } | 
|                     else | 
|                     { | 
|                         found = false; | 
|                         break; | 
|                     } | 
|                 } | 
|                 nextCursor = nextCursor + 1 + offset; | 
|                 wordlenght++; | 
|             } | 
|             if (blackWord.Length != wordCnt) return false; | 
|             return found; | 
|         } | 
|   | 
|         private static bool IsSpecial(char character) | 
|         { | 
|             if (character == ' ') | 
|             { | 
|                 return true; | 
|             } | 
|             return false; | 
|         } | 
|   | 
|         static public void DirtyWordInit() | 
|         { | 
|             if (dirtyWordInited) | 
|             { | 
|                 return; | 
|             } | 
|   | 
|             dirtyWordInited = true; | 
|   | 
|             ThreadPool.QueueUserWorkItem((object aaa) => | 
|             { | 
|                 memoryList.Sort((string x, string y) => | 
|                 { | 
|                     return x.CompareTo(y); | 
|                 }); | 
|                 for (int i = memoryList.Count - 1; i > 0; i--) | 
|                 { | 
|                     if (memoryList[i].ToString() == memoryList[i - 1].ToString()) | 
|                     { | 
|                         memoryList.RemoveAt(i); | 
|                     } | 
|                 } | 
|                 foreach (string word in memoryList) | 
|                 { | 
|                     WordGroup group = DIRTYWORLD[(int)word[0]]; | 
|                     if (group == null) | 
|                     { | 
|                         group = new WordGroup(); | 
|                         DIRTYWORLD[(int)word[0]] = group; | 
|                     } | 
|                     group.Add(word.Substring(1)); | 
|                 } | 
|             }); | 
|         } | 
|   | 
|         public static bool IsCHS(char character) | 
|         { | 
|             //  中文表意字符的范围 4E00-9FA5 | 
|             int charVal = (int)character; | 
|             return (charVal >= 0x4e00 && charVal <= 0x9fa5); | 
|         } | 
|   | 
|         private static bool IsNum(char character) | 
|         { | 
|             int charVal = (int)character; | 
|             return (charVal >= 48 && charVal <= 57); | 
|         } | 
|   | 
|         private static bool IsAlphabet(char character) | 
|         { | 
|             int charVal = (int)character; | 
|             return ((charVal >= 97 && charVal <= 122) || (charVal >= 65 && charVal <= 90)); | 
|         } | 
|   | 
|         private const string FACE_REPLACE = @"#~[0-9a-zA-Z]{1,3}"; | 
|         private static Regex FaceRegex = new Regex(FACE_REPLACE, RegexOptions.Singleline); | 
|         public static string FitterSpecial(string source) | 
|         { | 
|             return FaceRegex.Replace(source, "     "); | 
|         } | 
|     } | 
|   | 
|     class WordGroup | 
|     { | 
|         private List<string> groupList; | 
|   | 
|         public WordGroup() | 
|         { | 
|             groupList = new List<string>(); | 
|         } | 
|   | 
|         public void Add(string word) | 
|         { | 
|             groupList.Add(word); | 
|         } | 
|   | 
|         public int Count() | 
|         { | 
|             return groupList.Count; | 
|         } | 
|   | 
|         public string GetWord(int index) | 
|         { | 
|             return groupList[index]; | 
|         } | 
|     } |