Komutun cut
, seçeneğe -c
sahip baytlar yerine karakterler üzerinde çalışma seçeneği vardır -b
. Ancak bu, en_US.UTF-8
yerel olarak çalışmıyor gibi görünüyor :
İkinci bayt, ikinci ASCII karakterini verir (UTF-8'de aynı şekilde kodlanır):
$ printf 'ABC' | cut -b 2
B
ancak UTF-8 yerel ayarında üç Yunanca olmayan ASCII olmayan karakterin ikincisini vermez:
$ printf 'αβγ' | cut -b 2
�
Bu iyi - ikinci bayt .
Bunun yerine ikinci karaktere bakıyoruz :
$ printf 'αβγ' | cut -c 2
�
Kırık görünüyor.
Bazı deneylerde, aralığın 3-4
ikinci karakteri gösterdiği ortaya çıkıyor :
$ printf 'αβγ' | cut -c 3-4
β
Ancak bu, 3 ila 4 arasındaki baytlarla aynıdır:
$ printf 'αβγ' | cut -b 3-4
β
Yani UTF-8 için -c
fazla değildir -b
.
Yerel ayar UTF-8 için doğru değil, ancak karşılaştırma, wc
beklendiği gibi çalışır;
Genellikle -c
( --bytes
) seçeneği ile bayt saymak için kullanılır .
(Kafa karıştırıcı seçenek adlarına dikkat edin.)
$ printf 'αβγ' | wc -c
6
Ancak, şu şekilde çalışan seçenek -m
( --chars
) ile karakterleri de sayabilir :
$ printf 'αβγ' | wc -m
3
Bu yüzden yapılandırmam iyi görünüyor - ama özel bir şey var cut
.
Belki de UTF-8'i desteklemiyor? Ama aksi takdirde desteklemeye gerek olmazdı, çok baytlık karakterleri desteklemek için görünüyor -b
ve -c
.
Yani ne yanlış? Ve neden?
Yerel ayar, söyleyebildiğim kadarıyla utf8 için doğru görünüyor:
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Girdi, bayt bayt:
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
-c
aynı kodu kullanıyor-b
. Kaynak koduna baktınız mı? Belki de-c
aslında bunun için bir ipucu bulabilirsiniz .