$ locale charmap
UTF-8
Geçerli ortamımda, karakter kümesi UTF-8'dir, yani karakterler karakter başına 1 - 4 baytla kodlanır (ancak UTF-8'in izin verdiği karakter kodunun orijinal tanımı 0x7fffffff'e işaret ettiğinden, çoğu araç UTF'yi tanır. 6 bayta kadar 8 bayt dizileri).
Bu karakter kümesinde, Unicode'un tüm karakterleri mevcuttur, a a
örneğin bayt değeri 65, a 乕
3 bayt 228 185 149 ve é
iki bayt dizisi 195 169 olarak kodlanır .
$ printf 乕 | wc -mc
1 3
$ printf a | wc -mc
1 1
Şimdi:
$ export fr_FR.iso885915@euro
$ locale charmap
ISO-8859-15
Ben karakter kümesi şimdi ISO-8859-15 benim ortamı, modifiye ettik (dil, para birimi simgesi, tarih biçimi gibi diğer şeyler de modifiye edilmiş, bu bölgesel ayarların koleksiyonu olarak anılacaktır ediliyor yerel ayar ). Karakter oluşturmasını yeni yerel ayarlara uyarlayabilmesi için bu ortamda yeni bir terminal emülatörü başlatmam gerekiyor.
ISO-8859-15 tek baytlık bir karakter kümesidir, bu yalnızca 256 karaktere sahip olduğu anlamına gelir (aslında gerçekte kapsandığından daha az). Bu özel karakter seti, dillerinin çoğunu (ve euro simgesini) kapsadığı için Batı Avrupa dilleri için kullanılır.
Bu sahiptir a
UTF-8 veya ASCII, o da var gibi bayt değeri 65 ile karakterini é
karakterini (yaygın olarak örneğin Fransızca veya İspanyolca kullanılır) ama bayt değeri 233 ile, bu乕karakteri yoktur.
Bu ortamda wc -c
ve wc -m
her zaman aynı sonucu verecektir.
Çoğu Unix benzeri sistemde olduğu gibi Ubuntu'da da, varsayılan olarak Unicode serisinin tamamını kapsayan tek desteklenen karakter kümesi (ve kodlama) olduğu için genellikle UTF-8'dir.
Diğer çok baytlık karakter kodlamaları var, ancak Ubuntu'da iyi desteklenmiyorlar ve bunlarla bir yerel ayar oluşturabilmek için çemberlerden geçmek zorundasınız ve eğer yaparsanız, pek çok şeyin bu olmadığını göreceksiniz. düzgün çalışın.
Böylece Ubuntu'da geçerli olan karakter kümeleri ya tek baytlık, ya da UTF-8.
Şimdi, birkaç not daha:
UTF-8'de, tüm bayt dizileri geçerli karakterler oluşturmaz. Örneğin, ASCII olmayan tüm UTF-8 karakterleri, hepsinin 8. biti ayarlanmış, ancak yalnızca birincisinin 7. biti ayarlandığı baytlardan oluşur.
Hiçbiri 7. biti ayarlanmamış olan 8. biti ayarlanmış bir bayt dizisi varsa, bu bir karaktere çevrilemez. Ve o zaman, yazılımın bunlarla ne yapacağını bilmediğinden, problemler ve tutarsızlıklar yaşamaya başladığınızda. Örneğin:
$ printf '\200\200\200' | wc -mc
0 3
$ printf '\200\200\200' | grep -q . || echo no
no
wc
ve grep
orada hiçbir karakter bulamazsınız:
$ x=$'\200\200\200' bash -c 'echo "${#x}"'
3
bash
3 bulur. Bir bayt dizisini bir karaktere eşleyemediğinde, her byte'ı bir karakter olarak görür.
Unicode'da karakter olarak geçersiz, bazılarında karakter olmayan kod noktaları bulunduğundan daha karmaşık hale gelebilir ve araca bağlı olarak UTF-8 kodlamaları karakter olarak kabul edilebilir veya olmayabilir.
Dikkate alınması gereken bir başka şey, karakter ve grafem arasındaki fark ve bunların nasıl oluşturulduğu.
$ printf 'e\u301\u20dd\n'
é⃝
$ printf 'e\u301\u20dd' | wc -mc
3 6
Burada, bir karakter olarak işlenen 3 karakteri 6 bayt olarak kodladık, çünkü bir araya getirilmiş 3 karakterimiz var (bir temel karakter, bir araya gelen akut vurgu ve bir birleştirme dairesi).
wc
Ubuntu'da bulunan GNU uygulamasının -L
, girdideki en geniş satırın ekran genişliğini size söyleyebilecek bir anahtarı vardır :
$ printf 'e\u301\u20dd\n' | wc -L
1
Ayrıca bazı karakterlerin yukarıdan karakterimiz gibi genişlik hesaplamasında 2 hücre işgal ettiğini göreceksiniz 乕
:
$ echo 乕 | wc -L
2
Sonuç olarak: Wilder kelimesinde, byte, karakter ve graphem mutlaka aynı değildir.