分音記号で文字列をアルファベット順に並べる方法は?


7

Q:分音記号で文字列をアルファベット順に並べ替えるにはどうすればよいですか?

問題

私は著者名の長いリストを持っています。その中には、名前に発音区別符号が付いた文字が含まれているものもあります(例: "á"または "é")。このリストをアルファベット順に並べ替えたい。

問題:sortリストにを使用string-lesspして、アルファベット順に並べ替えられませ

姉妹サイトからのこの投稿で受け入れられた回答によると 、英語は、関係を断つことを除いて、分別を区別することを無視しています。(他の言語ではそれが異なります。)

おもちゃの例

これがおもちゃの例です。私が始める文字のリストは、すでにアルファベット順になっています。I場合はsort、このリストを使用して string-lessp、しかし、それは私が推測するものでそれらをソートではなく、アルファベット順よりもユニコードポイントの順序であります:

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

私は何をしますか?

分音記号を含む文字列をアルファベット順に並べ替えるにはどうすればよいですか?

少なくとも、上記の「引き分けを除いて発音区別符号を無視する」ルールを尊重したいと思います。理想的には、任意に定義された言語に従ってアルファベット順にできるようにしたいのですが、私は英語で問題なく解決します。


良い質問。OSの言語設定に依存するのか、依存する必要があるのか​​。アルファベット順は、一般的に言語に依存します。
ドリュー

回答:


8

システムロケールが、発音区別符号(ではなく POSIX)を適切に照合するものに設定されている場合は、これでうまくいくはずです。

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

それが機能しない場合は、ロケール文字列を3番目の引数として指定しstring-collate-lesspて、必要なものを取得できます。POSIXシステムでのアメリカ英語の例:

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

(MS-Windowsでのアメリカ英語の場合は、に置き換え"en_US.UTF-8"てください"enu_USA.1252"。)

これについてもう少し詳しく知り、内部で何が起こるかを確認したい場合はstr_collate、inの関数定義を確認することをお勧めしsrc/sysdep.cます。


まさに探していたもの、ありがとう!余談ですが、アメリカ英語以外の言語のロケール文字列をどこで検索できるかお話しいただけますか?
ダン

@Danそれはシステム依存の情報です。ロケール識別子のリストではありませんが、unix.stackexchangeからのこのQ&Aは、ほとんどのUNIXライクなシステムで適切な値を定式化するのに役立ちます。
Sam

フォローアップありがとうございます!
ダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.