Ketika saya menggunakan cut
hari ini, saya menemukan itu tidak memperlakukan karakter UTF-8 sebagai karakter, tetapi 3 karakter karena panjangnya 3 byte.
Ini tampaknya secara umum berlaku untuk banyak alat.
Apakah ada versi coreutils
yang disadari UTF-8?
locale
Output saya :
LANG=en_US.UTF-8
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=
Ini saatnya cut
tidak bekerja
echo 哈哈 | cut -c 2-
��哈
Output yang tepat seharusnya
哈
jika cut -c
bekerja dengan karakter multibyte.
locale
benar? Apa bacaanlocale
permintaan doa (tanpa argumen)?cut
baris perintah Anda ?echo ßßßß | cut -c 2-
->�ßßß
(LANG=en_US.UTF-8
)Jawaban:
GNU coreutils mengerti UTF-8 secara umum. Misalnya
echo 哈哈 | wc -m
dengan benar menghasilkan3
dalam lokal UTF-8 (perhatikan bahwa pilihannya adalah-m
, bukan-c
yang karena alasan historis berarti byte).Ini adalah bug di
cut
. Melihat sumbercut
,cut
pada karakter sama sekali tidak diimplementasikan:-c
opsi diperlakukan sebagai sinonim dari-b
.Solusinya adalah menggunakan awk. GNU awk berupaya dengan UTF-8.
sumber
Ini terlihat seperti bug di versi build / Anda
coreutils
. Saya dapat mereproduksi ini di Ubuntu 10.10 Maverick Meerkat tetapi tidak pada Fedora 15.Jika Anda juga menggunakan Ubuntu, Anda dapat melaporkan bug ke pembuat
coreutils
paket Ubuntu dengan menjalankan perintah berikut:Pembaruan: Gilles menunjukkan dalam komentar bahwa ini adalah bug dalam versi hulu
coreutils
yang telah ditambal Fedora. Anda dapat menemukan tambalan mereka di sini jika Anda ingin mencoba menambalnya sendiri untuk membuatnya bekerja.sumber
-c
alias-b
.