Làm thế nào để bảng chữ cái chuỗi với dấu phụ?


7

Q: làm thế nào để tôi sắp xếp thứ tự các chuỗi với dấu phụ?

Vấn đề

Tôi có một danh sách dài các tên tác giả, một số người có chữ cái có dấu phụ trong tên của họ (ví dụ: "á" hoặc "é"). Tôi muốn sắp xếp danh sách này theo thứ tự abc.

Vấn đề: sorting danh sách với string-lesspkhông không sắp xếp chúng theo thứ tự abc.

Theo câu trả lời được chấp nhận trong bài đăng này từ một trang web chị em , tiếng Anh bỏ qua các dấu phụ trong việc sắp xếp ngoại trừ phá vỡ mối quan hệ. (Các ngôn ngữ khác làm điều đó khác đi.)

Ví dụ đồ chơi

Đây là một ví dụ đồ chơi. Danh sách các chữ cái mà tôi bắt đầu đã được sắp xếp theo thứ tự abc. Tuy nhiên, khi tôi sortliệt kê danh sách này string-lessp, nó sẽ sắp xếp chúng theo thứ tự tôi đoán là thứ tự điểm unicode thay vì thứ tự chữ cái:

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

Tôi làm gì?

Làm thế nào tôi có thể sắp xếp thứ tự các chuỗi với dấu phụ trong đó?

Tối thiểu, tôi muốn tôn trọng quy tắc "bỏ qua dấu phụ ngoại trừ phá vỡ quan hệ" được mô tả ở trên. Lý tưởng nhất là tôi muốn có thể sắp xếp theo thứ tự chữ cái theo một ngôn ngữ được xác định tùy ý, nhưng tôi sẽ vui vẻ giải quyết tiếng Anh.


Câu hỏi hay. Tôi tự hỏi liệu nó phụ thuộc vào - hay nên phụ thuộc vào - cài đặt ngôn ngữ hệ điều hành của bạn. Bảng chữ cái phụ thuộc vào ngôn ngữ, nói chung.
vẽ

Câu trả lời:


8

Nếu ngôn ngữ hệ thống của bạn được đặt thành một cái gì đó sẽ đối chiếu đúng dấu phụ ( không POSIX ), thì điều này sẽ phù hợp với bạn:

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

Nếu điều đó không hiệu quả, bạn có thể cung cấp một chuỗi miền địa phương làm đối số thứ ba string-collate-lesspđể có được những gì bạn muốn. Với tiếng Anh Mỹ trên hệ thống POSIX, ví dụ:

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

(Đối với tiếng Anh Mỹ trên MS-Windows, thay thế "en_US.UTF-8"bằng "enu_USA.1252".)

Nếu bạn muốn tìm hiểu sâu hơn một chút để xem điều gì xảy ra dưới mui xe, tôi khuyên bạn nên xem định nghĩa hàm str_collatetrong src/sysdep.c.


Chính xác những gì tôi đang tìm kiếm, cảm ơn bạn! Ở một khía cạnh khác, bạn có thể đề cập đến nơi người ta có thể tra cứu các chuỗi địa phương cho các ngôn ngữ tiếng Anh không phải là tiếng Mỹ không?
Dân

@Dan Đó là thông tin phụ thuộc hệ thống AFAIK. Mặc dù không phải là danh sách các mã định danh miền địa phương, nhưng Q & A này từ unix.stackexchange sẽ giúp bạn hình thành các giá trị tốt trên hầu hết các hệ thống giống như unix.
Sam

Cảm ơn đã theo lên!
Dân
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.