UTF-8 문자 인코딩으로 임의의 문자가 포함된 텍스트 파일(1GB)을 만드는 방법은 무엇입니까?

UTF-8 문자 인코딩으로 임의의 문자가 포함된 텍스트 파일(1GB)을 만드는 방법은 무엇입니까?

다음 명령은 UTF-8을 사용하지 않습니다.head -c 1M </dev/urandom >myfile.txt

답변1

코드 포인트 0에서 0x7FFFFFFF까지의 UTF-8 인코딩을 원하는 경우(UTF-8 인코딩 알고리즘은 원래 처리하도록 설계되었습니다):

< /dev/urandom perl -CO -ne '
    BEGIN{$/=\4}
    no warnings "utf8";
    print chr(unpack("L>",$_) & 0x7fffffff)'

현재 유니코드는 0..D7FF, E000..10FFFF로 제한됩니다(이러한 문자 중 일부는 할당되지 않고 일부는 할당되지 않습니다(비문자로 정의됨)).

< /dev/urandom perl -CO -ne '
    BEGIN{$/=\3}
    no warnings "utf8";
    $c = unpack("L>","\0$_") * 0x10f800 >> 24;
    $c += 0x800 if $c >= 0xd800;
    print chr($c)'

네가 원한다면분산문자를 다음으로 파이프할 수 있습니다.

uconv -x '[:unassigned:]>;'

또는 다음과 같이 변경하세요.

< /dev/urandom perl -CO -ne '
    BEGIN{$/=\3}
    no warnings "utf8";
    $c = unpack("L>","\0$_") * 0x10f800 >> 24;
    $c += 0x800 if $c >= 0xd800;
    $c = chr $c;
    print $c if $c =~ /\P{unassigned}/'

당신은 다음을 선호할 수도 있습니다:

             if $c =~ /[\p{Space}\p{Graph}]/ && $c !~ /\p{Co}/

그래픽과 간격만 가져옵니다(개인 사용 섹션의 콘텐츠 제외).

이제 1GiB를 얻으려면 head -c1G(GNU 가정 head)에 파이프할 수 있지만 마지막 문자가 중간에 잘릴 수 있다는 점에 유의하세요.

답변2

UTF-8 문자 인코딩을 사용하여 10MB 텍스트 파일을 만드는 가장 효율적인 방법은 다음과 같습니다.base64 /dev/urandom | head -c 10000000 | egrep -ao "\w" | tr -d '\n' > file10MB.txt

답변3

Linux/GNU에서 ASCII(UTF-8 하위 집합) 문자에 대한 Grep:

dd if=/dev/random bs=1 count=1G | egrep -ao "\w" | tr -d '\n'

답변4

ASCII가 아닌 문자가 필요한 경우 유효한 UTF-8 시퀀스를 구성하는 방법이 필요합니다. 두 개의 연속 바이트가 유효한 UTF-8을 생성할 확률은 매우 낮습니다.

대신, 이 Python 스크립트는 유니코드 문자로 변환된 다음 UTF-8로 쓸 수 있는 임의의 8비트 값을 생성합니다.

import random
import io

char_count = 0

with io.open("random-utf8.txt", "w", encoding="utf-8") as my_file:

    while char_count <= 1000000 * 1024:
        rand_long = random.getrandbits(8)

        # Ignore control characters
        if rand_long <= 32 or (rand_long <= 0x9F and rand_long > 0x7F):
            continue

        unicode_char = unichr(rand_long)
        my_file.write(unicode_char)
        char_count += 1

또한 라틴어가 아닌 값을 생성하는 임의의 16자리 숫자를 사용하도록 변경할 수도 있습니다.

빠르지는 않지만 꽤 정확합니다.

관련 정보