분할을 사용하여 중국어 유니코드 바이트를 문자 블록으로 분할할 수 있습니까?

분할을 사용하여 중국어 유니코드 바이트를 문자 블록으로 분할할 수 있습니까?

나는 한동안 중국어 유니코드 텍스트를 다루어 왔습니다. 물론 일반적인 규칙이 적용됩니다. grep단어뿐만 아니라 문자로도 작업 할 수 있습니다 . 이것은 나에게 매우 유용합니다.

그런데 제가 아직 파악하지 못한 것이 하나 있습니다. 이것이 가능한지 모르겠습니다.

중국, 일본, 한국이 어떤 종류의 분열도 받아들이지 않을 것이라는 점은 당연합니다. 하지만 물론 split -l.

하지만 내가 원하는 것은 split원하는 수의 문자를 사용할 수 있는 것입니다.

중국어 유니코드에 대한 나의 이해는 각 문자 모양의 크기가 동일한 바이트 수라는 것입니다. 따라서 를 사용할 수 있는 최소 공배수인 마법의 바이트 수가 있어야 합니다. split -b그렇죠?

나는 그 숫자에 도달하기 위해 시행착오를 시도했지만 실패했습니다. 대신 문자 자체가 분할되어 CJK 파일이 두 개로 분할됩니다.

예를 들어, "Dongting Lake"라는 문자열만 포함하는 "dunting"이라는 파일을 사용하면 split본질적으로 의미 없는 콘텐츠가 생성됩니다. 심지어 캐릭터 중 하나가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, 유닉스의 일반적인 유니코드 인코딩입니다. 그러나 중국어가 아닌 문자(예: 공백 및 개행 문자)는 너비가 다를 수 있습니다(기본 제어 문자 및 아라비아 숫자 형식 등은 모두 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 '.'

관련 정보