分割を使用して中国語のUnicodeバイトを文字ブロックに分割できますか?

分割を使用して中国語のUnicodeバイトを文字ブロックに分割できますか?

私はしばらく中国語のUnicodeテキストを扱ってきました。もちろん、一般的なルールが適用されます。grep単語だけでなく、文字で作業することもできます。これは私にとって非常に便利です。

ところで、私がまだ把握していないことが一つあります。これが可能かどうかわかりません。

中国、日本、韓国がどのような分裂も受け入れないことは当然です。しかし、もちろんsplit -l

しかし、私が望むのは、split必要な数の文字を使用できることです。

中国語のUnicodeの私の理解は、各文字の形のサイズが同じバイト数であるということです。したがって、使用できる最小公倍数である魔法のバイト数が必要です。split -bそうですか?

私はその数に達するために試行錯誤しようとしましたが、失敗しました。代わりに、文字自体が分割され、CJKファイルが2つに分割されます。

たとえば、「Dongting Lake」という文字列のみを含む「dunting」というファイルを使用すると、split本質的に意味のないコンテンツが生成されます。キャラクターの1つがsplit溭に変わったこともあります...

答え1

xxd次の出力に示すように、各文字の幅は3バイトです。

$ 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エンコーディングです。ただし、中国語以外の文字(スペースや改行文字など)は幅が異なる場合があります(デフォルトの制御文字やアラビア数字の形式などはすべて1バイト幅です)。ユーティリティsplitは固定バイト数だけを理解しているため、整列されていないカットを無差別にします。

42文字ごとに分割するには、より洗練されたツールを使用する必要があります。以下は、トリックを実行するPerlフラグメントです(テストされていません)。すべての文字を同じように扱います。漢字は改行文字と同様に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 '.'

関連情報