F: Wie alphabetisiere ich Zeichenfolgen mit diakritischen Zeichen?
Problem
Ich habe eine lange Liste von Autorennamen, von denen einige Buchstaben mit diakritischen Zeichen enthalten (z. B. "á" oder "é"). Ich möchte diese Liste alphabetisch sortieren.
Das Problem: sort
ing die Liste mit string-lessp
nicht nicht sich alphabetisch sortiert werden .
Gemäß der akzeptierten Antwort in diesem Beitrag von einer Schwesterseite ignoriert Englisch die diakritischen Zeichen beim Sortieren, außer um Bindungen zu lösen. (Andere Sprachen machen es anders.)
Spielzeug Beispiel
Hier ist ein Spielzeugbeispiel. Die Liste der Buchstaben, mit denen ich beginne, ist bereits alphabetisch sortiert. Wenn ich sort
diese Liste
string-lessp
jedoch mit sortiere, werden sie in der von mir angenommenen Unicode-Punktreihenfolge und nicht in alphabetischer Reihenfolge sortiert:
(let ((letters '("a" "à" "á" "â" "b" "c" "e" "é" "ê")))
(sort letters #'string-lessp))
;; => ("a" "b" "c" "e" "à" "á" "â" "é" "ê")
Was mache ich?
Wie kann ich Zeichenfolgen mit diakritischen Zeichen alphabetisieren?
Zumindest möchte ich die oben beschriebene Regel "Diakritika ignorieren, außer Krawatten brechen" respektieren. Idealerweise möchte ich in der Lage sein, nach einer willkürlich definierten Sprache zu alphabetisieren, aber ich werde mich gerne mit Englisch zufrieden geben.
Antworten:
Wenn Ihr Systemgebietsschema auf etwas eingestellt ist, das diakritische Zeichen richtig sortiert ( nicht
POSIX
), sollte dies für Sie funktionieren:Wenn dies nicht funktioniert, können Sie als drittes Argument eine Gebietsschemazeichenfolge angeben
string-collate-lessp
, um das zu erhalten, was Sie möchten. Mit amerikanischem Englisch auf einem POSIX-System zum Beispiel:(Für amerikanisches Englisch unter MS-Windows ersetzen Sie
"en_US.UTF-8"
durch"enu_USA.1252"
.)Wenn Sie etwas näher darauf eingehen möchten, um zu sehen, was unter der Haube passiert, empfehle ich Ihnen, einen Blick auf die Funktionsdefinition von
str_collate
in zu werfensrc/sysdep.c
.quelle