是否知道utf的coreutils?


16

cut今天使用时,我发现它不会将UTF-8字符视为字符,而是3个字符,因为它的长度为3个字节。

对于许多工具来说,这似乎通常是正确的。

是否有支持coreutilsUTF-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使用多字节字符。


您设置locale正确吗?什么是的读数locale(W / O参数)命令调用?
alex

我已经更新了语言环境。
赵超

好的,您还可以添加一些cut命令行示例吗?
Alex

可以在Ubuntu 10.04上使用echo ßßßß | cut -c 2--> �ßßßLANG=en_US.UTF-8
maxschlepzig

可悲的是,三年后,在Ubuntu 13.10中仍然如此……
Mike

Answers:


13

GNU coreutils确实了解UTF-8。例如echo 哈哈 | wc -m3在UTF-8语言环境中正确输出(请注意,该选项为-m-c由于历史原因,它不是字节)。

这是中的错误cut。看一下的来源cutcut根本没有实现on字符:该-c选项被视为的同义词-b

解决方法是使用awk。GNU awk可以应付UTF-8。

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

8
值得提交一个错误报告(即使最终会成为重复报告),以使coreutils维护人员烦恼实际上修复这样的错误,而不是仅仅添加没有人需要的愚蠢的hack和玩具实用程序……
R .. GitHub STOP帮助冰

3

这看起来像是您的的构建/版本中的错误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 @全新世:/#grep DISTRIB_DESC / etc / lsb-release
DISTRIB_DESCRIPTION =“ Ubuntu 10.10”
root @全新世:/#dpkg-query -s coreutils | grep版本
版本:8.5-1ubuntu3
root @全新世:/#echo哈哈| 切-c 2-
哈

如果您还使用Ubuntu,则可以coreutils通过运行以下命令向Ubuntu 打包程序报告错误:

apport-bug coreutils

更新: Gilles在评论中指出,这是coreutilsFedora修补的上游版本中的错误。 如果您想尝试自己打补丁以使其正常运行,可以在这里找到他们的补丁


我只是查看了源代码,这显然是Fedora修补的上游错误。上游源简单地-c使用的别名-b
吉尔(Gilles)'所以

@吉尔斯:有趣。我在答案中链接到Fedora的补丁程序,以防有人想要尝试自己修复它。
补丁

链接断开。
corvus_192
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.