Perintah cutmemiliki opsi -cuntuk bekerja pada karakter, alih-alih byte dengan opsi -b. Tapi sepertinya itu tidak berhasil, di en_US.UTF-8tempat:
Byte kedua memberikan karakter ASCII kedua (yang dikodekan sama di UTF-8):
$ printf 'ABC' | cut -b 2
B
tetapi tidak memberikan karakter kedua dari tiga karakter non-ASCII Yunani di lokal UTF-8:
$ printf 'αβγ' | cut -b 2
�
Tidak apa-apa - ini byte kedua .
Jadi kita melihat karakter kedua sebagai gantinya:
$ printf 'αβγ' | cut -c 2
�
Itu terlihat rusak.
Dengan beberapa percobaan, rentang tersebut 3-4menunjukkan karakter kedua:
$ printf 'αβγ' | cut -c 3-4
β
Tapi itu sama dengan byte 3 hingga 4:
$ printf 'αβγ' | cut -b 3-4
β
Jadi -ctidak lebih dari -buntuk UTF-8.
Saya berharap pengaturan lokal tidak tepat untuk UTF-8, tetapi sebagai perbandingan, wcberfungsi seperti yang diharapkan;
Ini sering digunakan untuk menghitung byte, dengan opsi -c( --bytes).
(Perhatikan nama opsi yang membingungkan.)
$ printf 'αβγ' | wc -c
6
Tetapi juga dapat menghitung karakter dengan opsi -m( --chars), yang hanya berfungsi:
$ printf 'αβγ' | wc -m
3
Jadi konfigurasi saya tampaknya ok - tetapi ada sesuatu yang istimewa cut.
Mungkin tidak mendukung UTF-8 sama sekali? Tetapi tampaknya mendukung karakter multi-byte, jika tidak maka tidak perlu mendukung -bdan -c.
Jadi, apa yang salah? Dan mengapa?
Pengaturan lokal terlihat tepat untuk utf8, sejauh yang saya tahu:
$ 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=
Input, byte demi byte:
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
-cmenggunakan kode yang sama dengan-b. Apakah Anda sudah melihat kode sumbernya? Mungkin Anda bisa menemukan petunjuk untuk apa-csebenarnya.