今天使用时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
使用多字节字符。
答案1
GNU coreutils 一般来说理解 UTF-8。例如,以 UTF-8 语言环境echo 哈哈 | wc -m
正确输出(请注意,该选项是,而不是由于历史原因意味着字节)。3
-m
-c
这是 中的一个错误cut
。看着来源cut
, cut
on 字符根本没有实现:该-c
选项被视为 的同义词-b
。
解决方法是使用 awk。 GNU awk 可以很好地处理 UTF-8。
awk '{print substr($0,2,length)}'
答案2
这看起来像是您的构建/版本中的错误coreutils
。我可以在 Ubuntu 10.10 Maverick Meerkat 上重现此内容,但不能在 Fedora 15 上重现。
[patches@holocene ~]$ cat /etc/fedora-release Fedora 版本 15 (Lovelock) [patches@holocene ~]$ rpm -q coreutils coreutils-8.10-2.fc15.x86_64 [patches@holocene ~]$ echo 哈哈 |切-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 |版本号 版本:8.5-1ubuntu3 root@holocene:/# echo 哈哈 |切-c 2- ��哈
coreutils
如果您也使用 Ubuntu,则可以通过运行以下命令向 Ubuntu 打包程序报告错误:
apport-bug coreutils
更新: Gilles 在评论中指出,这是coreutils
Fedora 已修补的上游版本中的一个错误。 你可以在这里找到他们的补丁如果您想尝试自己修补它以使其正常工作。