Wie man Strings mit Diakritika alphabetisiert?

7

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: sorting die Liste mit string-lesspnicht 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 sortdiese Liste string-lesspjedoch 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.

Dan
quelle
Gute Frage. Ich frage mich, ob es von Ihrer Betriebssystem-Spracheinstellung abhängt oder abhängen sollte. Die Alphabetisierung ist im Allgemeinen sprachabhängig.
Drew

Antworten:

8

Wenn Ihr Systemgebietsschema auf etwas eingestellt ist, das diakritische Zeichen richtig sortiert ( nicht POSIX ), sollte dies für Sie funktionieren:

(let ((letters '("é" "a" "à" "c" "â" "b" "á" "e" "ê")))
  (sort letters #'string-collate-lessp))
;; => ("a" "á" "à" "â" "b" "c" "e" "é" "ê")

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:

(let ((letters '("é" "a" "à" "c" "â" "b" "á" "e" "ê")))
  (sort letters (lambda (a b) (string-collate-lessp a b "en_US.UTF-8"))))

(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_collatein zu werfen src/sysdep.c.

Sam
quelle
Genau das, wonach ich gesucht habe, danke! Könnten Sie nebenbei erwähnen, wo man die Gebietsschema-Zeichenfolgen für nicht-amerikanische englische Sprachen nachschlagen kann?
Dan
@ Dan Das ist systemabhängige Information AFAIK. Obwohl dies keine Auflistung von Gebietsschema- IDs ist, sollten diese Fragen und Antworten von unix.stackexchange Ihnen helfen, auf den meisten Unix-ähnlichen Systemen gute Werte zu formulieren.
Sam
Danke für das Follow-up!
Dan