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)'

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

欲しいなら分散文字を次にパイプできます。

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)にパイプすることができますが、最後の文字が途中で切り捨てられることに注意してください。

おすすめ記事