Aquí es una función de ejemplo que probablemente crea una secuencia aleatoria bien formado UTF-8, tal como se define en la Tabla 3-7 de 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)))
Debido a la gran extensión del estándar Unicode No puedo probar esto a fondo. También tenga en cuenta que los caracteres no están distribuidos por igual (pero cada byte en la secuencia es).
Podría ser útil si tuviera que dar más detalles sobre "probar el manejo Unicode de mi código" y explicar cuál es la parte que genera cadenas UTF-8 aleatorias en esa prueba, y qué usted considera como "todo el rango Unicode" (16 bits? 21 bits? puntos de código no sustitutos? caracteres válidos (por ejemplo, no U + FFFF)?). ¿Confías en el códec Python UTF-8 o también necesitas probarlo? Python 2.X o 3.X o ambos? –
El objetivo es aceptar cualquier punto de código Unicode imprimible (caracteres) como entrada para una interfaz web en Python 2.6. – l0b0