2013-08-20 35 views
7

Trong chương trình C, tôi muốn sắp xếp danh sách các chuỗi được mã hóa UTF-8 hợp lệ theo thứ tự điểm mã Unicode. Không có đối chiếu, không có nhận thức về địa phương.Strcmp có so sánh chuỗi utf-8 theo thứ tự điểm mã không?

Vì vậy, tôi cần một hàm so sánh. Thật dễ dàng để viết một hàm như vậy lặp lại các ký tự unicode. (Tôi tình cờ đang sử dụng GLib, vì vậy tôi sẽ lặp lại với g_utf8_next_char và so sánh giá trị trả về của g_utf8_next_char.)

Nhưng điều tôi tự hỏi, tò mò và có thể đơn giản và hiệu quả là: sẽ là một byte đơn giản -cho-byte strcmp (hoặc g_strcmp) thực sự làm cùng một công việc? Tôi nghĩ rằng, vì UTF-8 encodes các bit quan trọng nhất đầu tiên, và một điểm mã cần mã hóa trong N + 1 byte sẽ có một byte ban đầu lớn hơn một điểm mã cần được mã hóa bằng N byte.

Nhưng có thể tôi đang thiếu thứ gì đó? Cảm ơn trước.

Trả lời

7

Có, UTF-8 duy trì thứ tự bảng điểm, vì vậy bạn chỉ có thể sử dụng strcmp. Đó là một trong những (nhiều) điểm đẹp của UTF-8.

Thông báo trước là codepoints trong Unicode là giá trị UTF-32 và một số người nói về việc ghép chuỗi Unicode trong thứ tự "codepoint" thực sự đang sử dụng từ "codepoint" không chính xác để có nghĩa là "đơn vị mã UTF-16 ". Nếu bạn muốn thứ tự khớp với mã đơn vị mã UTF-16, một công việc tốt hơn có liên quan.

+0

Cảm ơn rất nhiều! Tôi sắp sửa theo dõi trường hợp sử dụng của mình và cách tôi không nghĩ rằng báo trước áp dụng, và sau đó thấy rằng thông tin này ở ngay trong [tiêu chuẩn] (http://www.w3.org/TR/xml- c14n # DocumentOrder) Tôi đang cố gắng triển khai: "So sánh bằng chữ cái, thứ tự chuỗi từ ít nhất đến lớn nhất theo thứ tự bảng chữ cái, dựa trên giá trị điểm của UCS, tương đương với thứ tự từ vựng dựa trên UTF-8." ':-)' – skagedal

Các vấn đề liên quan