我想测试我的代码的Unicode处理。我可以在random.choice()中选择从整个Unicode范围中选择,最好不是外部模块吗? Google和StackOverflow似乎都没有答案。
编辑:看起来这比预期的要复杂,所以我会重新解释一下这个问题 - 以下代码是否足以生成所有有效的non-control characters in Unicode?
unicode_glyphs = ''.join(
unichr(char)
for char in xrange(1114112) # 0x10ffff + 1
if unicodedata.category(unichr(char))[0] in ('LMNPSZ')
)
答案 0 :(得分:13)
人们可能会主要根据问题标题找到自己的方式,因此这里有一种生成包含各种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))
答案 1 :(得分:9)
答案 2 :(得分:7)
这是一个示例函数,可能会创建一个随机格式良好的UTF-8序列,如Unicode 5.0.0的表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标准的广泛性,我无法彻底测试。另请注意,字符的分布不均匀(但序列中的每个字节都是)。
答案 3 :(得分:4)
按照打印UTF-8的任何可打印字符的代码:
print(''.join(tuple(chr(i) for i in range(32, 0x110000) if chr(i).isprintable())))
上面包含所有可打印字符,即使是当前字体未打印的字符也是如此。可以添加子句and not chr(i).isspace()
来过滤掉空格字符。
答案 4 :(得分:3)
这取决于您希望进行测试的程度以及您希望如何准确地进行测试。完整地,Unicode是一个21位代码集(U + 0000 .. U + 10FFFF)。但是,该范围的一些相当大的块被留出用于自定义字符。你想担心在字符串的开头生成组合字符(因为它们应该只出现在另一个字符之后)吗?
我采用的基本方法是随机生成一个Unicode代码点(比如U + 2397或U + 31232),在上下文中验证它(它是一个合法的字符;它是否可以出现在字符串中)并且编码有效代码点为UTF-8。
如果您只是想检查您的代码是否正确处理格式错误的UTF-8,您可以使用更简单的生成方案。
请注意,您需要知道在输入时会发生什么 - 否则您没有进行测试;你在试验。
答案 5 :(得分:0)
由于Unicode只是一系列 - 井代码,使用unichr()获取对应于0到0xFFFF之间的随机数的unicode字符串怎么样?
(当然这只会给出一个代码点,所以根据需要进行迭代)
答案 6 :(得分:0)
您可以下载使用unicode编写的希腊语或德语网站,并将其提供给您的代码。
答案 7 :(得分:0)
回答修订后的问题:
是的,对“控制字符”的严格定义 - 请注意,您不会包含CR,LF和TAB;这就是你想要的吗?
请考虑回复我之前的邀请,告诉我们您的确想做什么。