Oto przykład funkcja prawdopodobnie tworzy losową dobrze uformowane UTF-8 sekwencji, jak zdefiniowano w Tabeli 3-7 Unicode 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)))
względu na szeroki zakres normy Unicode Nie mogę tego dokładnie przetestować. Zauważ również, że znaki nie są równomiernie rozmieszczone (ale każdy bajt w sekwencji jest).
Może ci pomóc, jeśli chcesz podać więcej szczegółów na temat "testowania kodu Unicode w moim kodzie" i wyjaśnij, co jest częścią, która generuje losowe ciągi UTF-8 w tym teście i co traktujesz to jako "cały zakres Unicode" (16 bitów? 21 bitów? nie są to surrogate punkty kodowe? prawidłowe znaki (np. nie U + FFFF)?). Czy ufasz kodekowi Python UTF-8, czy też musisz to przetestować? Python 2.X lub 3.X lub oba? –
Celem jest zaakceptowanie wszelkich możliwych do wydrukowania, poprawnych znaków kodowych Unicode (znaków) jako danych wejściowych dla interfejsu WWW w Pythonie 2.6. – l0b0