Bu, aynı sıralama düzenine sahip karakterlerin bir sonucudur.
Ayrıca şunu fark edeceksiniz:
sort -u << EOF
■
⅕
⅖
⅗
EOF
yalnızca bir satır döndürür.
Yada bu:
expr ■ = ⅕
true değerini döndürür (POSIX'in gerektirdiği gibi).
GNU sistemleri ile gönderilen çoğu yerel ayar, aynı sıralama düzenine sahip bir dizi karaktere (ve hatta karakter dizilerine (harmanlama dizileri)) sahiptir. Bu ■ ⅕⅖⅗ olanlar için, bunun nedeni, siparişin tanımlanmadığı ve sırası tanımlanmayan karakterlerin GNU sistemlerinde aynı sıralama düzenine sahip olmalarıdır. Açıkça Ș ve Ş gibi aynı sıralama düzenine sahip olarak tanımlanan karakterler vardır (yine de benim için açık bir gerçek mantık veya tutarlılık yoktur).
Bu oldukça şaşırtıcı ve sahte davranışların kaynağıdır. Austin grubu (POSIX ve Single UNIX Spesifikasyonu'nun arkasındaki gövde) posta listesinde bu konuyu çok yakın bir zamanda gündeme getirdim ve tartışma 2015-04-03 itibariyle hala devam ediyor.
Bu durumda, nerede ve aynı şekilde [y]
eşleşmesi gerekip gerekmediği benim için belirsizdir, ancak köşeli ayraç ifadesinin bir harmanlama öğesiyle eşleşmesi gerektiği için, bu davranışın beklendiğini gösterir.x
x
y
bash
Her durumda, sanırım [⅕-⅕]
ya da en azından [⅕-⅖]
eşleşmelidir ■
.
Farklı araçların farklı davrandığını fark edeceksiniz. ksh93 bash
, GNU gibi davranır grep
veya sed
davranmaz. Diğer bazı mermilerin farklı davranışları vardır, bazıları yash
daha fazla arabası gibi .
Tutarlı bir davranışa sahip olmak için, tüm karakterlerin farklı şekilde sıralandığı bir yerel ayara ihtiyacınız vardır. C yerel ayarı tipiktir. Bununla birlikte, çoğu sistemde C yerelinde ayarlanan karakter ASCII'dir. GNU sistemlerinde, genellikle C.UTF-8
UTF-8 karakteri üzerinde çalışmak için kullanılabilecek bir yerel ayara erişebilirsiniz .
Yani:
(export LC_ALL=C.UTF-8; [[ ■ = [⅕⅖⅗] ]])
veya standart eşdeğeri:
(export LC_ALL=C.UTF-8
case ■ in ([⅕⅖⅗]) true;; (*) false; esac)
yanlış döndürmelidir.
Başka bir alternatif, yalnızca LC_COLLATE
GNU sistemlerinde çalışacak olan C'ye ayarlamak , ancak çok baytlı karakterin sıralama düzenini belirleyemediği diğerlerine değil.
Bunun bir dersi, eşitliğin , dizeleri karşılaştırma söz konusu olduğunda bekleneceği kadar açık bir kavram olmadığıdır. Eşitlik, en katıdan en katıya doğru anlamına gelebilir.
- Aynı sayıda bayt ve tüm bayt bileşenleri aynı değere sahiptir.
- Aynı sayıda karakter ve tüm karakterler aynıdır (örneğin, geçerli karakter kümesindeki aynı kod noktasına bakın).
- İki dize, yerel ayarın harmanlama algoritmasına göre aynı sıralama düzenine sahiptir (yani, ne <b ne de b> a doğrudur).
Şimdi, 2 veya 3 için, her iki dizenin geçerli karakterler içerdiğini varsayar. UTF-8 ve diğer bazı kodlamalarda, bazı bayt dizileri geçerli karakterler oluşturmaz.
Bu nedenle veya bazı karakterler birden fazla olası kodlamaya sahip olabileceğinden, 1 ve 2 mutlaka eşdeğer değildir. Yani tipik ISO-2022-JP gibi durum bilgisi kodlamaların durum A
olarak ifade edilebilir 41
ya da 1b 28 42 41
( 1b 28 42
ASCII için anahtara diziyi olmak ve bir fark yaratmak olmaz, istediğiniz gibi kişilerin birçoğu olarak ekleyebilirsiniz), I gerçi bu tür kodlamanın hala kullanımda olmasını beklemezsiniz ve GNU araçları en azından genellikle onlarla düzgün çalışmaz.
Ayrıca, GNU olmayan çoğu yardımcı programın 0 bayt değeriyle (ASCII'deki NUL karakteri) baş edemeyeceğine dikkat edin.
Bu tanımların hangisi yardımcı programa ve yardımcı program uygulamasına veya sürümüne bağlıdır. POSIX bu konuda% 100 net değil. C yerelinde, 3'ün hepsi eşdeğerdir. O YMMV'nin dışında.