是否可以使用 split 将中文 unicode 字节拆分成字符块?

是否可以使用 split 将中文 unicode 字节拆分成字符块?

一段时间以来,我一直在处理中文 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 '.'

相关内容