lexicographical_order_with_unicode_tricks.gravity 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #unittest {
  2. name: "Lexicographical order, with unicode tricks, like objective-c compare with NSLiteralSearch option;";
  3. error: NONE;
  4. result: true;
  5. };
  6. // result like the objective-c compare with NSLiteralSearch option (the localizedCompare: give FALSE)
  7. func main () {
  8. // comparing equivalent Unicode strings
  9. /*
  10. http://stackoverflow.com/questions/2877418/is-there-a-difference-between-nsstring-compare-and-isequaltostring
  11. isEqualToString: is really more analogous to compare: options:NSLiteralSearch, as can be seen in the above quote.
  12. NSLiteralSearch is more finicky about Unicode character representation:
  13. “Literal” when applied to string comparison means that various Unicode decomposition rules are not applied and Unicode
  14. characters are individually compared. So, for instance, “Ö” represented as the composed character sequence “O” and
  15. umlaut would not compare equal to “Ö” represented as one Unicode character.
  16. example in objective-c:
  17. NSString *eAcute = @"\u00e9"; // single character 'é'
  18. NSString *ePlusAcute = @"e\u0301"; // 'e' + combining '´'
  19. NSComparisonResult localized,literal;
  20. BOOL isEqualToString;
  21. localized = [eAcute localizedCompare:ePlusAcute];
  22. literal = [eAcute compare:ePlusAcute options:NSLiteralSearch];
  23. isEqualToString = [eAcute isEqualToString:ePlusAcute];
  24. // localized => NSOrderedSame
  25. // literal => NSOrderedDescending
  26. // isEqualToString => NO
  27. NSString *oDiaeresis = @"Ö"; // single symbol 'Ö'
  28. NSString *oPlusDiaeresis = @"Ö"; // 'O' + combining ' ̈' (U+0308)
  29. localized = [oDiaeresis localizedCompare:oPlusDiaeresis];
  30. literal = [oDiaeresis compare:oPlusDiaeresis options:NSLiteralSearch];
  31. isEqualToString = [oDiaeresis isEqualToString:oPlusDiaeresis];
  32. // localized => NSOrderedSame
  33. // literal => NSOrderedDescending
  34. // isEqualToString => NO
  35. */
  36. var eAcute = "é"; // single character 'é' "\u00e9"
  37. var ePlusAcute = "é"; // 'e' + combining '´' "e\u0301"
  38. var oDiaeresis = "Ö"; // single symbol 'Ö'
  39. var oPlusDiaeresis = "Ö"; // 'O' + combining ' ̈' (U+0308)
  40. var r1 = (eAcute > ePlusAcute);
  41. var r2 = (oDiaeresis > oPlusDiaeresis);
  42. /*
  43. var r1 = !(eAcute < ePlusAcute) && !(eAcute > ePlusAcute) && (eAcute != ePlusAcute) && (eAcute == ePlusAcute);
  44. var r2 = !(oDiaeresis < oPlusDiaeresis) && !(oDiaeresis > oPlusDiaeresis) &&
  45. (oDiaeresis != oPlusDiaeresis) && (oDiaeresis == oPlusDiaeresis);
  46. */
  47. return r1 && r2;
  48. }