Unicode

支持 utf 的 coreutils?

  • November 11, 2015

今天用的時候cut,發現它並沒有把一個UTF-8字元當成一個字元,而是3個字元,因為它有3個字節長。

對於許多工具來說,這似乎通常是正確的。

是否有coreutils支持 UTF-8 的版本?

我的locale輸出:

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=

這是什麼時候cut不起作用

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

正確的輸出應該是

如果cut -c使用多字節字元。

GNU coreutils 通常理解 UTF-8。例如,在 UTF-8 語言環境中echo 哈哈 | wc -m正確輸出3(注意選項是-m-c由於歷史原因,它不是字節)。

這是cut. 查看, on characters 的來源cutcut根本沒有實現:該-c選項被視為-b.

一種解決方法是使用 awk。GNU awk 可以很好地處理 UTF-8。

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

這看起來像是您的建構/版本中的錯誤coreutils。我可以在 Ubuntu 10.10 Maverick Meerkat 上重現這一點,但不能在 Fedora 15 上重現。

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

如果您也在使用 Ubuntu,則可以coreutils通過執行以下命令向 Ubuntu 打包程序報告錯誤:

apport-bug coreutils

更新: Gilles 在評論中指出,這是coreutilsFedora 已修補的上游版本中的一個錯誤。 如果您想嘗試自己修補以使其正常工作,您可以在此處找到他們的更新檔。

引用自:https://unix.stackexchange.com/questions/15961