Q: how can I get
string-collate-lessp to sort correctly?
string-collate-lessp is supposed to sort two strings in
Return t if first arg string is less than second in collation order. Symbols are also allowed; their print names are used instead.
This function obeys the conventions for collation order in your locale settings....
Yet I'm getting odd behavior with it. This works:
(string-collate-lessp "abcdef" "abcdefg") ; => t
As does this:
(string-collate-lessp "abcdef" "abcaef") ; => nil (note "a" in place of "d")
And yet this does not:
(string-collate-lessp "abcdef" "abc aef") ; => nil (note "space a")
While this does work:
(string-collate-lessp "abcdef" "abc eef") ; => t (note "space e")
It seems to be the case that the function is ignoring the space between the two "words" in the second string and using the first letter of the second word to compare to the corresponding letter in the first word (here, the fourth letter).
This behavior leads to strange outcomes. For example, when I want to alphabetize these two names, it puts them in the incorrect order:
(string-collate-lessp "Baumgartner, Robert" "Baum, Matthew") ; => t
Yet "Baum" should come before "Baumgartner" in English-language sorting, not after. If it were "Baum, Arthur", however, it sorts correctly, because the "a" in "Arthur" sorts before the "g" in "Baumgartner":
(string-collate-lessp "Baumgartner, Robert" "Baum, Arthur") ; => nil
How do I fix this problem?
NB: I am not using plain
string-lessp because some of the
strings have diacritics in them.
this related post.