Упорядочение строк в Lua

Я читаю Программирование в Lua, 1-е издание (да, я знаю, это немного устарело), ​​а в раздел 3.2 (о реляционных операторах), автор говорит:

Например, с европейским языком Latin-1 у нас есть "acai" < "açaí" < "Acorde".

Я не понимаю. Для меня это нормально, если "acai" < "açaí", но почему "açaí" < "acorde"?

AFAIK (и википедия, похоже, подтверждает), "c" < "ç", или я ошибаюсь?

Ответ 1

Вы ссылаетесь на кодовую страницу, которая сопоставляет кодовые страницы символам. Конечно, кодовые точки, являющиеся конечным набором неотрицательных целых чисел, являются хорошо упорядоченными, разными объектами. Однако это не то, о чем говорят герои.

Персонажи имеют collation порядок, который является частичным упорядочением: символы могут быть "равными", но не одинаковыми. Collation - это понятная пользователем концепция, которая зависит от локали (и с течением времени).

Строки еще сложнее, потому что некоторые наборы символов (например, Unicode) могут содержать комбинации символов. Это позволяет "символу" быть представленным как один символ или как базовый символ, за которым следуют комбинирующие символы. Например, "ä" против "a¨". Поскольку они представляют один и тот же концептуальный характер, их следует считать еще более равными, чем "ä" против "a".

На испанском языке "ch", "rr" и "ll" использовались для буквы в алфавите, и слова были упорядочены соответственно; Теперь они еще не "...".

Аналогичным образом, в прошлом для англоговорящих нередко сортировались фамилии, начинающиеся с "Mc" и "Mac" после других, начиная с "M".

Библиотеки программного обеспечения должны иметь дело с такими вещами, потому что это то, что хотят пользователи. К счастью, некоторые из старых конвенций упали от использования.


Таким образом, язык может очень хорошо иметь правила сортировки, которые приводят к "acai" < "açaí" < "acorde", если "c" имеет тот же порядок сортировки, что и "ç", но "i" предшествует "í". Этот случай кажется странным, хотя возможность вообще требует, чтобы наш код позволял это.

Ответ 2

В третьем издании PiL это утверждение было изменено:

Например, с португальским языком Latin-1 у нас есть "acai"<"açaí"<"acorde".

Таким образом, языковой стандарт должен быть установлен на португальский Latin-1 соответственно:

print("acai" < "açaí")
print("açaí" < "acorde")

print(os.setlocale("pt_PT"))

print("acai" < "açaí")
print("açaí" < "acorde")

В ideone результат:

true
false
pt_PT.iso88591
false
true

Но порядок "acai" и "açaí" кажется теперь отличным от книги.