Генерируйте случайную строку UTF-8 в Python

Я видел nvarchar столбцы, преобразованные в varchar по двум причинам:

  1. Приложение использует MSSQL Express Edition, который имеет предел размера базы данных 4GB. Переключение на MSSQL Standard Edition было бы слишком дорогим, если бы существует много развертывания базы данных, как был бы в веб-приложениях единственного арендатора или приложениях со встроенным DBMS. Более дешевый SQL2008 Web Edition мог помочь здесь.

  2. nvarchar (4000) недостаточно , но Вы не хотите столбца типа ntext. Таким образом, Вы преобразовываете в varchar (8000). Однако в большинстве случаев, вероятно, необходимо преобразовать в nvarchar (макс.).

23
задан John Machin 28 September 2009 в 14:43
поделиться

6 ответов

Есть стресс-тест UTF-8 от Маркуса Куна , который вы можете использовать.

См. Также Действительно хороший, плохой пример тестовых данных UTF-8 .

10
ответ дан 29 November 2019 в 02:08
поделиться

Вот пример функции, которая, вероятно, создает случайную правильно сформированную последовательность UTF-8, как определено в Таблице 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)))

Из-за обширности стандарта Unicode я не могу проверить это полностью. Также обратите внимание, что символы распределены неравномерно (но есть каждый байт в последовательности).

как определено в таблице 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)))

Из-за обширности стандарта Unicode я не могу его полностью протестировать. Также обратите внимание, что символы распределены неравномерно (но есть каждый байт в последовательности).

как определено в таблице 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)))

Из-за обширности стандарта Unicode я не могу его полностью протестировать. Также обратите внимание, что символы распределены неравномерно (но есть каждый байт в последовательности).

7
ответ дан 29 November 2019 в 02:08
поделиться

Поскольку Unicode - это просто диапазон - ну - кодов, как насчет использования unichr () для получения строки Unicode, соответствующей случайное число от 0 до 0xFFFF?
(Конечно, это дало бы только одну кодовую точку, поэтому повторяйте по мере необходимости)

0
ответ дан 29 November 2019 в 02:08
поделиться

Это зависит от того, насколько тщательно вы хотите провести тестирование и насколько точно вы хотите выполнить генерацию. В полном объеме Unicode представляет собой 21-битный кодовый набор (U + 0000 .. U + 10FFFF). Однако некоторые довольно большие части этого диапазона отведены для пользовательских символов. Хотите ли вы беспокоиться о создании комбинируемых символов в начале строки (потому что они должны появляться только после другого символа)?

Основной подход, который я выберу, - это случайное создание кодовой точки Unicode (скажем, U + 2397 или U +31232), проверьте его в контексте (является ли это допустимым символом; может ли он появиться здесь в строке) и закодируйте действительные кодовые точки в UTF-8.

Если вы просто хотите проверить, обрабатывает ли ваш код искаженный UTF-8 правильно, вы можете использовать гораздо более простые схемы генерации.

Обратите внимание, что вам нужно знать, чего ожидать при вводе - иначе вы не будете тестировать; вы экспериментируете.

3
ответ дан 29 November 2019 в 02:08
поделиться

Вы можете загрузить веб-сайт, написанный на греческом или немецком языке и использующий Unicode, и передать его в свой код.

0
ответ дан 29 November 2019 в 02:08
поделиться

Ответ на измененный вопрос:

Да, относительно строгого определения «управляющих символов» - обратите внимание, что вы не будете включать CR, LF и TAB; это то, что вы хотите?

Пожалуйста, подумайте о том, чтобы ответить на мое предыдущее приглашение рассказать нам, что вы действительно пытаетесь сделать.

0
ответ дан 29 November 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: