private static string Map(string domainName, bool TransitionalProcessing, bool UseStd3AsciiRules, out bool error) { error = false; StringBuilder buffer = new StringBuilder(); foreach (char c in domainName) { CodePointEntry entry = MappingTable.GetEntry(c); switch (entry.Status) { case CodePointStatus.Valid: buffer.Append(c); break; case CodePointStatus.Ignored: break; case CodePointStatus.Mapped: buffer.Append(entry.Mapping); break; case CodePointStatus.Deviation: if (TransitionalProcessing) { buffer.Append(entry.Mapping); } else { buffer.Append(c); } break; case CodePointStatus.Disallowed: error = true; return(string.Empty); case CodePointStatus.Disallowed_STD3_valid: if (UseStd3AsciiRules) { error = true; return(string.Empty); } goto case CodePointStatus.Valid; case CodePointStatus.Disallowed_STD3_mapped: if (UseStd3AsciiRules) { error = true; return(string.Empty); } goto case CodePointStatus.Mapped; } } return(buffer.ToString()); }
public CodePointEntry GetEntry(char input) { CodePointEntry entry = new CodePointEntry(); for (int i = 0; i < entries.Length; i++) { if (entries[i].Range.Contains(input)) { entry = entries[i]; break; } } return(entry); }
public void Load(Stream stream) { List <CodePointEntry> codePointEntries = new List <CodePointEntry>(); StreamReader reader = new StreamReader(stream); while (!reader.EndOfStream) { CodePointEntry entry = new CodePointEntry(); string input = reader.ReadLine(); string[] result = GetTokens(input); if (result[1] == null) { continue; } if (!entry.Range.Generate(result[0])) { continue; } entry.Status = (CodePointStatus)Enum.Parse(typeof(CodePointStatus), result[1].FirstLetterToUpperCase()); if (result[2] != null) { entry.Mapping = new string(result[2].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select((s) => { return((char)int.Parse(s.Trim(), System.Globalization.NumberStyles.HexNumber)); }).ToArray()); if (result[3] != null) { entry.IDNA2008Status = (IDNA2008Status)Enum.Parse(typeof(IDNA2008Status), result[3]); } } else { entry.Mapping = string.Empty; } codePointEntries.Add(entry); } entries = codePointEntries.ToArray(); }