Coreutils được utf nhận thức?


16

Khi tôi sử dụng cutngày hôm nay, tôi phát hiện ra nó không coi ký tự UTF-8 là ký tự, mà là 3 ký tự vì nó dài 3 byte.

Điều này dường như nói chung đúng với nhiều công cụ.

Có phiên bản nào của coreutilsUTF-8 không?

localeĐầu ra của tôi :

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=

Đây là khi cutkhông làm việc

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

Đầu ra đúng phải là

nếu cut -clàm việc với các nhân vật đa nhân.


Bạn đã thiết lập localeđúng? Việc đọc localelệnh gọi (w / o argument) là gì?
alex

Tôi đã cập nhật với miền địa phương.
Chao Xu

OK, bạn cũng có thể thêm một số ví dụ về cutdòng lệnh của bạn ?
alex

Có thể xác nhận điều này trên Ubuntu 10.04 với echo ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig

Điều đáng buồn là, 3 năm sau, điều này vẫn đúng trong Ubuntu 13.10 ...
Tiến sĩ Mike

Câu trả lời:


13

GNU coreutils hiểu UTF-8 nói chung. Ví dụ, echo 哈哈 | wc -mđầu ra chính xác 3trong ngôn ngữ UTF-8 (lưu ý rằng tùy chọn này -m, không phải -cvì lý do lịch sử có nghĩa là byte).

Đây là một lỗi trong cut. Nhìn vào nguồn củacut , cuttrên các ký tự đơn giản là không được thực hiện: -ctùy chọn được coi là từ đồng nghĩa của -b.

Một cách giải quyết là sử dụng awk. GNU awk đối phó với UTF-8 tốt.

awk '{print substr($0,2,length)}'

8
Sẽ đáng để nộp một bugreport (ngay cả khi nó bị trùng lặp) để gây phiền toái cho những người bảo trì coreutils thực sự sửa các lỗi như thế này, thay vì chỉ thêm các bản hack và tiện ích đồ chơi ngu ngốc mà không ai cần ...
R ..

3

Điều này trông giống như một lỗi trong bản dựng / phiên bản của bạn coreutils. Tôi có thể sao chép điều này trên Ubuntu 10.10 Maverick Meerkat nhưng không phải trên Fedora 15.

[bản vá @ holocene ~] $ cat / etc / fedora-phát hành 
Fedora phát hành 15 (Lovelock)
[patch @ holocene ~] $ core -q coreutils
lõi-8.10-2.fc15.x86_64
[bản vá @ holocene ~] $ echo | cắt -c 2-
哈
[bản vá @ holocene ~] $ sudo chroot / mnt / maverick
root @ holocene: / # grep DISTRIB_DESC / etc / lsb-phát hành
DISTRIB_DESCRIPTION = "Ubuntu 10.10"
root @ holocene: / # dpkg-query -s coreutils | phiên bản grep
Phiên bản: 8,5-1ubfox3
root @ holocene: / # echo | cắt -c 2-
哈

Nếu bạn cũng đang sử dụng Ubuntu, bạn có thể báo cáo lỗi cho trình coreutilsđóng gói Ubuntu bằng cách chạy lệnh sau:

apport-bug coreutils

Cập nhật: Gilles chỉ ra trong các ý kiến ​​rằng đây là một lỗi trong phiên bản ngược dòng coreutilsmà Fedora đã vá. Bạn có thể tìm thấy bản vá của họ ở đây nếu bạn muốn thử tự vá nó để nó hoạt động.


Tôi chỉ nhìn vào nguồn, và đó là một lỗi ngược dòng mà Fedora rõ ràng đã vá. Nguồn ngược dòng chỉ đơn giản là làm cho -cmột bí danh -b.
Gilles 'SO- đừng trở nên xấu xa'

@Gilles: Thú vị. Tôi đã liên kết với bản vá của Fedora trong câu trả lời của mình trong trường hợp ai đó muốn thử và tự sửa nó.
Bản vá lỗi

Liên kết bị hỏng.
corvus_192
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.