生成Python中随机UTF-8字符串(Generate random UTF-8 string i

2019-07-19 14:57发布

我想测试我的代码的统一处理。 有什么我可以把random.choice()从整个Unicode范围内选择,最好不要外部模块? 无论是谷歌还是StackOverflow上似乎有一个答案。

编辑:它看起来像这比预期的更为复杂,所以我会改写这个问题-是下面的代码足以产生的所有有效Unicode中的非控制字符 ?

unicode_glyphs = ''.join(
    unichr(char)
    for char in xrange(1114112) # 0x10ffff + 1
    if unicodedata.category(unichr(char))[0] in ('LMNPSZ')
    )

Answer 1:

有一个从马库斯·库恩UTF-8的压力测试 ,你可以使用。

又见确实不错,坏UTF-8例如测试数据 。



Answer 2:

人们可以在这里找到自己的方式主要基于问题的标题,所以这里的生成含有多种Unicode字符随机字符串的方法。 包括更多(或更少)可能的字符,只是扩展的代码点的例子的那部分范围,你想要的。

import random

def get_random_unicode(length):

    try:
        get_char = unichr
    except NameError:
        get_char = chr

    # Update this to include code point ranges to be sampled
    include_ranges = [
        ( 0x0021, 0x0021 ),
        ( 0x0023, 0x0026 ),
        ( 0x0028, 0x007E ),
        ( 0x00A1, 0x00AC ),
        ( 0x00AE, 0x00FF ),
        ( 0x0100, 0x017F ),
        ( 0x0180, 0x024F ),
        ( 0x2C60, 0x2C7F ),
        ( 0x16A0, 0x16F0 ),
        ( 0x0370, 0x0377 ),
        ( 0x037A, 0x037E ),
        ( 0x0384, 0x038A ),
        ( 0x038C, 0x038C ),
    ]

    alphabet = [
        get_char(code_point) for current_range in include_ranges
            for code_point in range(current_range[0], current_range[1] + 1)
    ]
    return ''.join(random.choice(alphabet) for i in range(length))

if __name__ == '__main__':
    print('A random string: ' + get_random_unicode(10))


Answer 3:

下面是可能创建随机合式UTF-8序列,如在5.0.0的Unicode的表3-7中定义的示例功能:

#!/usr/bin/env python3.1

# From Table 3–7 of the Unicode Standard 5.0.0

import random

def byte_range(first, last):
    return list(range(first, last+1))

first_values = byte_range(0x00, 0x7F) + byte_range(0xC2, 0xF4)
trailing_values = byte_range(0x80, 0xBF)

def random_utf8_seq():
    first = random.choice(first_values)
    if first <= 0x7F:
        return bytes([first])
    elif first <= 0xDF:
        return bytes([first, random.choice(trailing_values)])
    elif first == 0xE0:
        return bytes([first, random.choice(byte_range(0xA0, 0xBF)), random.choice(trailing_values)])
    elif first == 0xED:
        return bytes([first, random.choice(byte_range(0x80, 0x9F)), random.choice(trailing_values)])
    elif first <= 0xEF:
        return bytes([first, random.choice(trailing_values), random.choice(trailing_values)])
    elif first == 0xF0:
        return bytes([first, random.choice(byte_range(0x90, 0xBF)), random.choice(trailing_values), random.choice(trailing_values)])
    elif first <= 0xF3:
        return bytes([first, random.choice(trailing_values), random.choice(trailing_values), random.choice(trailing_values)])
    elif first == 0xF4:
        return bytes([first, random.choice(byte_range(0x80, 0x8F)), random.choice(trailing_values), random.choice(trailing_values)])

print("".join(str(random_utf8_seq(), "utf8") for i in range(10)))

因为Unicode标准浩瀚的,我不能彻底地测试这一点。 还要注意的是,字符不会平均分配(但序列中的每个字节)。



Answer 4:

这取决于你想如何彻底做的测试,以及如何准确你想要做的产生。 在充分,Unicode是一个21位的码集(U + 0000 .. U + 10FFFF)。 然而,该范围的一些比较大的块为自定义字符预留。 你要担心的一个字符串(因为他们应该只出现另一个字符后)开始生成组合字符?

基本的方法我会采用随机生成一个Unicode代码点(比如U + 2397或U + 31232),确认它在上下文(它是一个合法的字符,它可以出现在这里的字符串),并在有效编码代码点UTF-8。

如果你只是想检查你的代码是否处理畸形的UTF-8正确,你可以用更简单的生成方案。

请注意,您需要知道会发生什么给出输入 - 否则,你不是测试; 您正在试验。



Answer 5:

如下打印UTF-8的任何可打印字符代码:

print(''.join(tuple(chr(l) for l in range(1, 0x10ffff)
                    if chr(l).isprintable())))

所有字符都存在,即使是那些没有被使用的字体处理。 and not chr(l).isspace()可以以过滤掉所有空格字符添加。 (包括选项卡)



Answer 6:

由于Unicode的只是一个范围 - 好 - 代码,有关使用unichr(),以获得对应于0和0xFFFF之间的随机数Unicode字符串是什么?
(当然,这将使只有一个码点,从而需要重复)



Answer 7:

您可以下载写在希腊或德国的一个网站,使用Unicode和饲料,为您的代码。



Answer 8:

回答修订问题:

是的,对“控制字符”一个严格的定义 - 请注意,您将不包括CR,LF和TAB; 那是你要的吗?

请考虑回答我刚才的邀请,告诉我们你真的想这样做。



文章来源: Generate random UTF-8 string in Python