Thứ tự đối chiếu thông qua LC_COLLATE
định nghĩa không chỉ thứ tự sắp xếp của từng ký tự mà còn cả ý nghĩa của phạm vi ký tự. Hay không? Hãy xem xét đoạn trích sau:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Theo trực giác, B
không phải trong [a-z]
, vì vậy điều này không nên xuất ra bất cứ điều gì. Đó là những gì xảy ra trên Ubuntu 8.04 hoặc 10.04. Nhưng trên một số máy chạy lenny Debian hoặc bóp, B
được tìm thấy, bởi vì phạm vi a-z
bao gồm tất cả mọi thứ đó là giữa a
và z
theo thứ tự đối chiếu, bao gồm cả chữ in hoa B
qua Z
.
Tất cả các hệ thống được thử nghiệm đều có en_US
miền địa phương được tạo ra. Tôi cũng đã thử thay đổi ngôn ngữ khác nhau: trên các máy B
được khớp ở trên, điều tương tự cũng xảy ra ở mọi ngôn ngữ có sẵn (chủ yếu dựa trên tiếng Latin : {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
, cũng là tiếng Trung Quốc) ngoại trừ tiếng Nhật (trong bất kỳ mã hóa có sẵn nào) và C
/ POSIX
.
Phạm vi ký tự có ý nghĩa gì trong các biểu thức thông thường , khi bạn vượt ra ngoài ASCII? Tại sao có một sự khác biệt giữa một số cài đặt Debian một mặt và mặt khác các cài đặt Debian và Ubuntu? Làm thế nào để các hệ thống khác hành xử? Ai đúng và ai nên báo cáo lỗi?
(Lưu ý rằng tôi đặc biệt yêu cầu về hành vi của nhân vật dao động như [a-z]
trong en_US
miền địa phương, chủ yếu là trên các hệ thống libc dựa trên GNU. Tôi không yêu cầu như thế nào để phù hợp với chữ thường hoặc chữ ASCII chữ thường.)
Trên hai máy Debian, một máy B
ở trong [a-z]
và một máy không có, đầu ra LC_COLLATE=en_US locale -k LC_COLLATE
là
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
và đầu ra của LC_COLLATE=en_US.utf8 locale -k LC_COLLATE
là
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
miền địa phương được sử dụng làm dự phòng và thứ tự đối chiếu của nó là các giá trị byte thẳng, do đó B
sẽ không được khớp. Kiểm tra tại một địa điểm xuất hiện trong đầu ra của locale -a
.
en_US
được tạo ra, mặc dù.