一段时间以来,我一直在处理中文 unicode 文本。当然,通常的规则适用。我可以grep
像处理文字一样处理角色。这对我来说非常有用。
但有一件事我还没想明白。我不知道这是否可能。
按理说,中日韩不会接受各种分裂。但是,当然,使用split -l
.
不过,我想做的是能够使用split
任意数量的字符。
我对中文unicode的理解是每个字形的大小都是相同的字节数。因此,应该有一些神奇的字节数,即最小公倍数,这将允许我使用split -b
,对吧?
我曾经尝试过一次错误,希望能够达到这个数字,但没能做到。相反,字符本身被拆分,从而将 CJK 文件一分为二。
例如,给定一个名为“dunting”的文件,其中仅包含字符串“洞庭湖”,使用split
最终会产生本质上无意义的内容。其中一个角色甚至在split
……期间变成了溭。
答案1
每个字符都是三个字节宽,如以下xxd
输出所示:
$ xxd chinese-bytes
0000000: e6b4 9ee5 baad e6b9 96 .........
split -b3
对我有用。
$ split -b3 chinese-bytes
$ echo xa?
xaa xab xac
$ cat xaa; echo
洞
$ cat xab; echo
庭
$ cat xac; echo
湖
答案2
据我所知,所有汉字编码时都是3个字节长UTF-8,unix 上的正常 Unicode 编码。但非中文字符(例如空格和换行符)可能具有不同的宽度(基本控制字符以及阿拉伯数字形式等都是单字节宽)。该split
实用程序仅理解固定数量的字节,因此它会不加区别地进行不对齐的切割。
您需要使用更复杂的工具来分割每 42 个字符。这是一个可以解决问题的 Perl 片段(未经测试)。请注意,它对每个字符都一视同仁:一个汉字计为 1,换行符也计为 1。
perl -CDS -e '
$n = 0;
while (read STDIN, $buf, 42) {
open OUT, sprintf("> output-$n.txt") or die;
print OUT $buf;
close OUT or die;
++$n;
}'
答案3
在我使用的 mac 终端中egrep -o '.'