coreutils yang benar-benar sadar?

16

Ketika saya menggunakan cuthari 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 coreutilsyang disadari UTF-8?

localeOutput 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 cuttidak bekerja

echo 哈哈 | cut -c 2-
��哈

Output yang tepat seharusnya

jika cut -cbekerja dengan karakter multibyte.

Chao Xu
sumber
Apakah Anda mengatur dengan localebenar? Apa bacaan localepermintaan doa (tanpa argumen)?
alex
Saya telah memperbarui dengan lokal.
Chao Xu
OK, bisakah Anda juga menambahkan beberapa contoh cutbaris perintah Anda ?
alex
Dapat mengkonfirmasi ini di Ubuntu 10,04 dengan echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig
Yang menyedihkan adalah, 3 tahun kemudian, ini masih berlaku di Ubuntu 13.10 ...
Dr. Mike

Jawaban:

13

GNU coreutils mengerti UTF-8 secara umum. Misalnya echo 哈哈 | wc -mdengan benar menghasilkan 3dalam lokal UTF-8 (perhatikan bahwa pilihannya adalah -m, bukan -cyang karena alasan historis berarti byte).

Ini adalah bug di cut. Melihat sumbercut , cutpada karakter sama sekali tidak diimplementasikan: -copsi diperlakukan sebagai sinonim dari -b.

Solusinya adalah menggunakan awk. GNU awk berupaya dengan UTF-8.

awk '{print substr($0,2,length)}'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
8
Akan lebih baik jika Anda melaporkan bug (bahkan jika itu merupakan duplikat) untuk mengganggu pengelola core agar benar-benar memperbaiki bug seperti ini, daripada hanya menambahkan peretasan bodoh dan utilitas mainan yang tidak diperlukan ...
R .. GitHub STOP MEMBANTU ICE
3

Ini terlihat seperti bug di versi build / Anda coreutils. Saya dapat mereproduksi ini di Ubuntu 10.10 Maverick Meerkat tetapi tidak pada Fedora 15.

[patches @ holocene ~] $ cat / etc / fedora-release 
Rilis Fedora 15 (Lovelock)
[patches @ holocene ~] $ rpm -q coreutils
coreutils-8.10-2.fc15.x86_64
[patches @ holocene ~] $ echo 哈哈 | cut -c 2-
哈
[patches @ holocene ~] $ sudo chroot / mnt / maverick
root @ holocene: / # grep DISTRIB_DESC / etc / lsb-release
DISTRIB_DESCRIPTION = "Ubuntu 10.10"
root @ holocene: / # dpkg-query -s coreutils | Versi grep
Versi: 8.5-1ubuntu3
root @ holocene: / # echo 哈哈 | cut -c 2-
哈

Jika Anda juga menggunakan Ubuntu, Anda dapat melaporkan bug ke pembuat coreutilspaket Ubuntu dengan menjalankan perintah berikut:

apport-bug coreutils

Pembaruan: Gilles menunjukkan dalam komentar bahwa ini adalah bug dalam versi hulu coreutilsyang telah ditambal Fedora. Anda dapat menemukan tambalan mereka di sini jika Anda ingin mencoba menambalnya sendiri untuk membuatnya bekerja.

Tambalan
sumber
Saya baru saja melihat sumbernya, dan itu adalah bug hulu yang tampaknya ditambal Fedora. Sumber upstream hanya membuat -calias -b.
Gilles 'SO- berhenti bersikap jahat'
@Gilles: Menarik. Saya menautkan ke tambalan Fedora dalam jawaban saya jika seseorang ingin mencoba dan memperbaikinya sendiri.
Tambalan
Tautan rusak.
corvus_192