ランダムにUTF-8の文字列を生成しようとしてつまったので適当な解決策
codes = (0x00 ... 0x1ffff).to_a
chars = []
(rand(10) + 10).times do
chars << codes[rand(codes.length)]
end
chars.pack('U*')
これで10文字から20文字のUTF-8の文字列がランダムに生成できる。制御文字とかもばんばん入ってくるのでテストデータとしては有効に作用し、僕のコードのバグが露見する。作らなければよかった。