code_junkie

Ignoring accented letters in string comparison

Nov 12th, 2011
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.23 KB | None | 0 0
  1. string s1 = "hello";
  2. string s2 = "héllo";
  3.  
  4. s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase);
  5. s1.Equals(s2, StringComparison.OrdinalIgnoreCase);
  6.  
  7. static string RemoveDiacritics(string text)
  8. {
  9. string formD = text.Normalize(NormalizationForm.FormD);
  10. StringBuilder sb = new StringBuilder();
  11.  
  12. foreach (char ch in formD)
  13. {
  14. UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
  15. if (uc != UnicodeCategory.NonSpacingMark)
  16. {
  17. sb.Append(ch);
  18. }
  19. }
  20.  
  21. return sb.ToString().Normalize(NormalizationForm.FormC);
  22. }
  23.  
  24. Debug.Assert("hello"==RemoveDiacritics("héllo"));
  25.  
  26. private static bool CompareIgnoreAccents(string s1, string s2)
  27. {
  28. return string.Compare(
  29. RemoveAccents(s1), RemoveAccents(s2), StringComparison.InvariantCultureIgnoreCase) == 0;
  30. }
  31.  
  32. private static string RemoveAccents(string s)
  33. {
  34. Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");
  35.  
  36. return destEncoding.GetString(
  37. Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
  38. }
  39.  
  40. public static string RemoveAccents(this string s)
  41. {
  42. Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");
  43.  
  44. return destEncoding.GetString(
  45. Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
  46. }
  47.  
  48. if(string.Compare(s1.RemoveAccents(), s2.RemoveAccents(), true) == 0) {
  49. ...
  50.  
  51. string s1 = "hello";
  52. string s2 = "héllo";
  53.  
  54. if (String.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace) == 0)
  55. {
  56. // both strings are equal
  57. }
  58.  
  59. using System;
  60. using System.Globalization;
  61.  
  62. class Sample {
  63. public static void Main() {
  64. String str1 = "change";
  65. String str2 = "dollar";
  66. String relation = null;
  67.  
  68. relation = symbol( String.Compare(str1, str2, false, new CultureInfo("en-US")) );
  69. Console.WriteLine("For en-US: {0} {1} {2}", str1, relation, str2);
  70.  
  71. relation = symbol( String.Compare(str1, str2, false, new CultureInfo("cs-CZ")) );
  72. Console.WriteLine("For cs-CZ: {0} {1} {2}", str1, relation, str2);
  73. }
  74.  
  75. private static String symbol(int r) {
  76. String s = "=";
  77. if (r < 0) s = "<";
  78. else if (r > 0) s = ">";
  79. return s;
  80. }
  81. }
  82. /*
  83. This example produces the following results.
  84. For en-US: change < dollar
  85. For cs-CZ: change > dollar
  86. */
Add Comment
Please, Sign In to add comment