stringprep — Подготовка строки согласно RFC 3453


При идентификации объектов (например, имён хостов) в Интернете часто необходимо сравнивать идентификации на предмет «равенства». Как именно выполняется сравнение, может зависеть от домена приложения, например, должен ли он быть нечувствительным к регистру или нет. Также может быть необходимо ограничить возможные идентификации, чтобы разрешить только идентификации, состоящие из «печатных» символов.

RFC 3454 определяет процедуру «подготовки» Юникод строк в интернет-протоколах. Перед передачей строк на обработку, они обрабатываются процедурой подготовки, после чего приобретают нормализованную форму. RFC определяет множество таблиц, которые можно объединять в профили. Каждый профиль должен определять, какие таблицы он использует и какие другие необязательные части процедуры stringprep являются частью профиля. Одним из примеров профиля stringprep является nameprep, используемый для интернационализированных доменных имён.

Модуль stringprep предоставляет только таблицы из RFC 3454. Поскольку данные таблицы были бы очень большими, чтобы представлять их в виде словарей или списков, модуль использует внутреннюю базу данных символов Юникод. Сам исходный код модуля был сгенерирован с помощью утилиты mkstringprep.py.

В результате данные таблицы отображаются как функции, а не как структуры данных. В RFC есть два вида таблиц: множества и сопоставления. Для множеств stringprep предоставляет «характеристическую функцию», т. е. функцию, которая возвращает True, если параметр является частью множества. Для сопоставлений он предоставляет функцию сопоставления: по ключу он возвращает связанное значение. Ниже приведен список всех доступных в модуле функций.

stringprep.in_table_a1(code)

Определяет, находится ли code в таблице A.1 (неназначенные кодовые точки в Юникод 3.2).

stringprep.in_table_b1(code)

Определяет, находится ли code в таблице B.1 (обычно ничего не отображается).

stringprep.map_table_b2(code)

Возвращает сопоставленное значение для code в соответствии с таблицей B.2 (сопоставление для складывания регистра, используемое с NFKC).

stringprep.map_table_b3(code)

Возвращает сопоставленное значение для code в соответствии с таблицей B.3 (сопоставление для свертывания регистра используется без нормализации).

stringprep.in_table_c11(code)

Определяет, находится ли code в таблице C.1.1 (символы пробела ASCII).

stringprep.in_table_c12(code)

Определяет, находится ли code в таблице C.1.2 (пробелы, отличные от ASCII).

stringprep.in_table_c11_c12(code)

Определяет, находится ли code в таблице C.1 (пробелы, объединение C.1.1 и C.1.2).

stringprep.in_table_c21(code)

Определяет, находится ли code в таблице C.2.1 (управляющие символы ASCII).

stringprep.in_table_c22(code)

Определяет, находится ли code в таблице C.2.2 (управляющие символы, отличные от ASCII).

stringprep.in_table_c21_c22(code)

Определяет, находится ли code в таблице C.2 (управляющие символы, объединение C.2.1 и C.2.2).

stringprep.in_table_c3(code)

Определяет, находится ли code в таблице C.3 (частное использование).

stringprep.in_table_c4(code)

Определяет, находится ли code в таблице C.4 (несимвольные кодовые точки).

stringprep.in_table_c5(code)

Определяет, присутствует ли code в таблице C.5 (суррогатные коды).

stringprep.in_table_c6(code)

Определяет, находится ли code в таблице C.6 (не подходит для обычного текста).

stringprep.in_table_c7(code)

Определяет, находится ли code в таблице C.7 (не подходит для канонического представления).

stringprep.in_table_c8(code)

Определяет, находится ли code в таблице C.8 (изменить свойства отображения или устарели).

stringprep.in_table_c9(code)

Определяет, находится ли code в таблице C.9 (маркировка символов).

stringprep.in_table_d1(code)

Определяет, находится ли code в таблице D.1 (символы с двунаправленным свойством «R» или «AL»).

stringprep.in_table_d2(code)

Определяет, находится ли code в таблице D.2 (символы с двунаправленным свойством «L»).