web-dev-qa-db-ja.com

UTF-8文字エンコードでランダムな文字を含むテキストファイル(1ギガバイト)を作成するにはどうすればよいですか?

次のコマンドはUTF-8を使用しません:head -c 1M </dev/urandom >myfile.txt

3
Message Passing

コードポイント0〜0x7FFFFFFFのUTF-8エンコーディングが必要な場合(UTF-8エンコーディングアルゴリズムは元々機能するように設計されていました):

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

現在、Unicodeは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)'

assigned文字のみが必要な場合は、次の宛先にパイプできます。

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と仮定))が、最後の文字が途中でカットされる可能性があることに注意してください。

4

サイズが10MBでUTF-8文字エンコードのテキストファイルを作成する最も効率的な方法は、base64 /dev/urandom | head -c 10000000 | egrep -ao "\w" | tr -d '\n' > file10MB.txtです。

2
Message Passing

Linux/GNUでのASCII(UTF-8のサブセット)文字のGrep:

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

非ASCII文字が必要な場合は、有効なUTF-8シーケンスを作成する方法が必要です。有効なUTF-8を生成する2つの連続したバイトの可能性は非常に低いです。

代わりに、このPythonスクリプトは、Unicode文字に変換して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ビット数を使用するように変更することもできます。

高速ではありませんが、かなり正確です。

0