The sort alghorithm has nothing to do with ls, but with your selection of LC_COLLATE. But then, BSD (at least the variant used in MacOSX) is way behind current l10n standards.
At least they do not break s/[A-Z]// which on "well-internationalized" OSes is case-insensitive with most locales other than C.
I still haven't dug enough to understand if the responsible for this is the POSIX specification for localization, the ANSI specification for strcoll, or somebody in the glibc team. But I know that it was the most-reported sed "bug" before I explicitly flagged it as a non-bug in the manual.
I can only guess the outcry if Perl started obeying LC_COLLATE.
Paolo