Comment créer un file text (1 gigaoctet) contenant des caractères randoms avec un enencoding UTF-8?

La command suivante n'utilise pas UTF-8: head -c 1M </dev/urandom >myfile.txt

Si vous voulez que les encodings UTF-8 des points de code 0 à 0x7FFFFFFF (sur lesquels l'algorithm de encoding UTF-8 a été conçu à l'origine) fonctionnent:

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

De nos jours, l'Unicode est limité à 0..D7FF, E000..10FFFF (bien que certains de ces caractères ne soient pas assignés, dont certains ne seront jamais définis comme des non-caractères).

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

Si vous ne souhaitez que des caractères assignés , vous pouvez l'appliquer à:

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

Ou changez cela en:

 < /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}/' 

Vous préférerez peut-être:

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

Pour get uniquement des charts et des espacements (exclure ceux des sections à usage privé).

Maintenant, pour get 1GiB de cela, vous pouvez le head -c1G vers la head -c1G (en supposant que la head GNU), mais attention le dernier caractère peut être coupé au milieu.

Le moyen le plus efficace de créer un file text avec un enencoding de caractères de taille 10 Mo et UTF-8 est base64 /dev/urandom | head -c 10000000 | egrep -ao "\w" | tr -d '\n' > file10MB.txt base64 /dev/urandom | head -c 10000000 | egrep -ao "\w" | tr -d '\n' > file10MB.txt

Grep pour les caractères ASCII (sous-set d'UTF-8), sous Linux / GNU:

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

Si vous voulez des caractères non-ASCII, vous aurez besoin d'un moyen de build des séquences UTF-8 valides. La chance que deux octets consécutifs donnant un UTF-8 valide soit très faible.

Au lieu de cela, ce script Python crée des valeurs randoms de 8 bits qui peuvent être converties en caractères Unicode, puis écrites en tant que 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 

Vous pouvez également le changer pour utiliser un nombre random de 16 bits qui donnerait des valeurs non latines.

Ce n'est pas rapide mais assez précis.