我想测试我的代码的统一处理。 有什么我可以把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')
)
有一个从马库斯·库恩UTF-8的压力测试 ,你可以使用。
又见确实不错,坏UTF-8例如测试数据 。
人们可以在这里找到自己的方式主要基于问题的标题,所以这里的生成含有多种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))
下面是可能创建随机合式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标准浩瀚的,我不能彻底地测试这一点。 还要注意的是,字符不会平均分配(但序列中的每个字节)。
这取决于你想如何彻底做的测试,以及如何准确你想要做的产生。 在充分,Unicode是一个21位的码集(U + 0000 .. U + 10FFFF)。 然而,该范围的一些比较大的块为自定义字符预留。 你要担心的一个字符串(因为他们应该只出现另一个字符后)开始生成组合字符?
基本的方法我会采用随机生成一个Unicode代码点(比如U + 2397或U + 31232),确认它在上下文(它是一个合法的字符,它可以出现在这里的字符串),并在有效编码代码点UTF-8。
如果你只是想检查你的代码是否处理畸形的UTF-8正确,你可以用更简单的生成方案。
请注意,您需要知道会发生什么给出输入 - 否则,你不是测试; 您正在试验。
如下打印UTF-8的任何可打印字符代码:
print(''.join(tuple(chr(l) for l in range(1, 0x10ffff)
if chr(l).isprintable())))
所有字符都存在,即使是那些没有被使用的字体处理。 and not chr(l).isspace()
可以以过滤掉所有空格字符添加。 (包括选项卡)
由于Unicode的只是一个范围 - 好 - 代码,有关使用unichr(),以获得对应于0和0xFFFF之间的随机数Unicode字符串是什么?
(当然,这将使只有一个码点,从而需要重复)
您可以下载写在希腊或德国的一个网站,使用Unicode和饲料,为您的代码。
回答修订问题:
是的,对“控制字符”一个严格的定义 - 请注意,您将不包括CR,LF和TAB; 那是你要的吗?
请考虑回答我刚才的邀请,告诉我们你真的想这样做。