Ниже приведен пример функции, которая, вероятно, создает случайный хорошо сформированную последовательность UTF-8, как определено в Таблице 3-7 Юникода 5.0.0:
#!/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 Я не могу проверить это полностью. Также обратите внимание, что символы неравномерно распределены (но каждый байт в последовательности).
Это может помочь, если вы хотите дать более подробную информацию о «проверке обработки Юникодом моего кода» и объясните, какая часть, которая генерирует случайные строки UTF-8, должна играть в этом тестировании и что вы считаете «весь диапазон Unicode» (16 бит? 21 бит? не суррогатные коды? допустимые символы (например, не U + FFFF)?). Вы доверяете кодеку Python UTF-8, или вам нужно также проверить это? Python 2.X или 3.X или оба? –
Цель состоит в том, чтобы принять любые допустимые коды кода (символы) для кода Unicode для ввода для веб-интерфейса в Python 2.6. – l0b0