다음 명령은 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자리 숫자를 사용하도록 변경할 수도 있습니다.
빠르지는 않지만 꽤 정확합니다.