12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #unittest {
- name: "Lexicographical order, with unicode tricks, like objective-c compare with NSLiteralSearch option;";
- error: NONE;
- result: true;
- };
- // result like the objective-c compare with NSLiteralSearch option (the localizedCompare: give FALSE)
- func main () {
- // comparing equivalent Unicode strings
-
- /*
- http://stackoverflow.com/questions/2877418/is-there-a-difference-between-nsstring-compare-and-isequaltostring
- isEqualToString: is really more analogous to compare: options:NSLiteralSearch, as can be seen in the above quote.
- NSLiteralSearch is more finicky about Unicode character representation:
-
- “Literal” when applied to string comparison means that various Unicode decomposition rules are not applied and Unicode
- characters are individually compared. So, for instance, “Ö” represented as the composed character sequence “O” and
- umlaut would not compare equal to “Ö” represented as one Unicode character.
-
- example in objective-c:
-
- NSString *eAcute = @"\u00e9"; // single character 'é'
- NSString *ePlusAcute = @"e\u0301"; // 'e' + combining '´'
-
- NSComparisonResult localized,literal;
- BOOL isEqualToString;
-
- localized = [eAcute localizedCompare:ePlusAcute];
- literal = [eAcute compare:ePlusAcute options:NSLiteralSearch];
- isEqualToString = [eAcute isEqualToString:ePlusAcute];
-
- // localized => NSOrderedSame
- // literal => NSOrderedDescending
- // isEqualToString => NO
-
- NSString *oDiaeresis = @"Ö"; // single symbol 'Ö'
- NSString *oPlusDiaeresis = @"Ö"; // 'O' + combining ' ̈' (U+0308)
-
- localized = [oDiaeresis localizedCompare:oPlusDiaeresis];
- literal = [oDiaeresis compare:oPlusDiaeresis options:NSLiteralSearch];
- isEqualToString = [oDiaeresis isEqualToString:oPlusDiaeresis];
-
- // localized => NSOrderedSame
- // literal => NSOrderedDescending
- // isEqualToString => NO
- */
-
- var eAcute = "é"; // single character 'é' "\u00e9"
- var ePlusAcute = "é"; // 'e' + combining '´' "e\u0301"
-
- var oDiaeresis = "Ö"; // single symbol 'Ö'
- var oPlusDiaeresis = "Ö"; // 'O' + combining ' ̈' (U+0308)
-
- var r1 = (eAcute > ePlusAcute);
- var r2 = (oDiaeresis > oPlusDiaeresis);
-
- /*
- var r1 = !(eAcute < ePlusAcute) && !(eAcute > ePlusAcute) && (eAcute != ePlusAcute) && (eAcute == ePlusAcute);
- var r2 = !(oDiaeresis < oPlusDiaeresis) && !(oDiaeresis > oPlusDiaeresis) &&
- (oDiaeresis != oPlusDiaeresis) && (oDiaeresis == oPlusDiaeresis);
- */
-
- return r1 && r2;
- }
|