Como eu crio um arquivo de texto (1 gigabyte) contendo caracteres aleatórios com codificação de caracteres UTF-8?

3

O seguinte comando não usa UTF-8: head -c 1M </dev/urandom >myfile.txt

    
por Message Passing 26.11.2015 / 10:52

4 respostas

4

Se você quiser as codificações UTF-8 dos pontos de código 0 a 0x7FFFFFFF (para o qual o algoritmo de codificação UTF-8 foi originalmente projetado para funcionar):

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

Atualmente, o Unicode é restrito a 0..D7FF, E000..10FFFF (embora alguns desses caracteres não sejam atribuídos, alguns dos quais nunca serão (são definidos como não-caracteres)).

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

Se você quer apenas caracteres atribuídos , pode canalizar isso para:

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

Ou altere para:

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

Você pode preferir:

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

Para obter somente gráficos e espaços (exclua os das seções de uso privado).

Agora, para obter 1GiB disso, você pode canalizá-lo para head -c1G (assumindo o GNU head ), mas cuidado com o último caractere que pode ser cortado no meio.

    
por 26.11.2015 / 15:44
2

A maneira mais eficiente de criar um arquivo de texto com codificação de caracteres tamanho 10 MB e UTF-8 é base64 /dev/urandom | head -c 10000000 | egrep -ao "\w" | tr -d '\n' > file10MB.txt

    
por 26.11.2015 / 14:41
0

Grep para caracteres ASCII (sub-conjunto de UTF-8), no Linux / GNU:

dd if=/dev/random bs=1 count=1G | egrep -ao "\w" | tr -d '\n'
    
por 26.11.2015 / 11:34
0

Se você quiser caracteres não-ASCII, precisará de uma maneira de construir sequências UTF-8 válidas. A chance de que dois bytes consecutivos produzindo um UTF-8 válido sejam muito baixos.

Em vez disso, este script Python cria valores aleatórios de 8 bits que podem ser convertidos em caracteres Unicode e depois gravados como UTF-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

Você também pode alterá-lo para usar um número aleatório de 16 bits que renderia valores não latinos.

Não é rápido, mas bastante preciso.

    
por 26.11.2015 / 14:47