ไม่ไม่ถือว่าพวกเขาเทียบเท่า แต่พวกเขามีน้ำหนักหลักเท่ากัน ดังนั้นในการประมาณครั้งแรกพวกมันก็เรียงแบบเดียวกัน
หากคุณดู / usr / share / i18n / locales / iso14651_t1_common (ซึ่งใช้เป็นพื้นฐานสำหรับโลแคลส่วนใหญ่) บนระบบ GNU (ที่นี่ด้วย glibc 2.27) คุณจะเห็น:
<U0065> <e>;<BAS>;<MIN>;IGNORE # 259 e
<U025B> <e>;<PCL>;<MIN>;IGNORE # 287 ɛ
<U0045> <e>;<BAS>;<CAP>;IGNORE # 577 E
e
, ɛ
และE
มีน้ำหนักหลักเดียวกันe
และE
น้ำหนักรองเดียวกันเพียงสามน้ำหนักแตกต่างได้
เมื่อเปรียบเทียบสตริงsort
( strcoll()
ฟังก์ชัน libc มาตรฐานจะใช้ในการเปรียบเทียบสตริง) เริ่มต้นโดยการเปรียบเทียบน้ำหนักหลักของตัวละครทั้งหมดและไปที่น้ำหนักที่สองเท่านั้นหากสตริงเท่ากับน้ำหนักหลัก (และอื่น ๆ ด้วยน้ำหนักอื่น ๆ ) .
นั่นเป็นกรณีที่ดูเหมือนว่าจะถูกละเว้นในการเรียงลำดับในการประมาณครั้งแรก Ab
ทุกประเภทระหว่างaa
และac
แต่Ab
สามารถเรียงลำดับก่อนหรือหลังab
ขึ้นอยู่กับกฎภาษา (บางภาษามี<MIN>
มาก่อน<CAP>
เช่นเดียวกับในอังกฤษบางส่วน<CAP>
ก่อนที่จะ<MIN>
เหมือนในเอสโตเนีย)
หากe
มีการเรียงลำดับเช่นเดียวกับɛ
, printf '%s\n' e ɛ | sort -u
จะกลับมาเพียงหนึ่งบรรทัด แต่เป็น<BAS>
ประเภทก่อน<PCL>
, e
ประเภทคนเดียวก่อน เรียงลำดับตาม(ที่น้ำหนักรอง) แม้ว่าจะเรียงลำดับตามหลัง(ซึ่งเราจำเป็นต้องขึ้นสู่น้ำหนักที่สาม)ɛ
eɛe
EEE
EEE
eee
ตอนนี้ถ้าในระบบของฉันด้วย glibc 2.27 ฉันเรียกใช้:
sed -n 's/\(.*;[^[:blank:]]*\).*/\1/p' /usr/share/i18n/locales/iso14651_t1_common |
sort -k2 | uniq -Df1
คุณจะสังเกตเห็นว่ามีตัวละครไม่กี่ตัวที่ถูกกำหนดด้วยน้ำหนัก 4 ตัวที่แน่นอน โดยเฉพาะอย่างยิ่ง our ของเรามีน้ำหนักเท่ากับ:
<U01DD> <e>;<PCL>;<MIN>;IGNORE
<U0259> <e>;<PCL>;<MIN>;IGNORE
<U025B> <e>;<PCL>;<MIN>;IGNORE
และนั่นเอง:
$ printf '%s\n' $'\u01DD' $'\u0259' $'\u025B' | sort -u
ǝ
$ expr ɛ = ǝ
1
ที่สามารถมองเห็นเป็นข้อบกพร่องของสถานที่ libc GNU ในระบบอื่น ๆ ส่วนใหญ่โลแคลต้องแน่ใจว่าอักขระที่แตกต่างกันทั้งหมดมีลำดับการเรียงลำดับที่แตกต่างกันในตอนท้าย เกี่ยวกับสถานที่ของ GNU ได้รับก็แย่ตามที่มีมากมายของตัวละครที่ไม่ได้มีคำสั่งการเรียงลำดับและจบลงด้วยการเรียงลำดับเดียวกันที่ก่อให้เกิดปัญหาทุกประเภท (เช่นหมดcomm
, join
, ls
หรือ globs มีคำสั่งซื้อที่ไม่ได้กำหนด ... ) จึงเสนอแนะของการใช้LC_ALL=C
เพื่อหลีกเลี่ยงปัญหาเหล่านั้น
ตามที่บันทึกไว้โดย @ninjalj ในความคิดเห็น glibc 2.28 ที่ปล่อยออกมาในเดือนสิงหาคม 2561 มาพร้อมกับการปรับปรุงบางอย่างที่ด้านหน้าแม้ว่า AFAICS ยังมีตัวละครหรือองค์ประกอบการเรียงที่กำหนดด้วยลำดับการเรียงเหมือนกัน บน Ubuntu 18.10 พร้อม glibc 2.28 และในภาษา en_GB.UTF-8
$ expr $'L\ub7' = $'L\u387'
1
(เพราะเหตุใด U + 00B7 จึงถูกพิจารณาว่าเทียบเท่ากับ U + 0387 เมื่อรวมกับL
/ ?! l
)
และ:
$ perl -lC -e 'for($i=0; $i<0x110000; $i++) {$i = 0xe000 if $i == 0xd800; print chr($i)}' | sort > all-chars-sorted
$ uniq -d all-chars-sorted | wc -l
4
$ uniq -D all-chars-sorted | wc -l
1061355
(ยังมีมากกว่า 1 ล้านตัวอักษร (95% ของช่วง Unicode ลดลงจาก 98% ใน 2.27) การเรียงลำดับเหมือนกับตัวอักษรอื่น ๆ เนื่องจากไม่ได้กำหนดลำดับการเรียงลำดับ)
ดูสิ่งนี้ด้วย: