:mod:`!stringprep` --- Internet String Preparation
==================================================

.. module:: stringprep
   :synopsis: String preparation, as per RFC 3453

.. moduleauthor:: Martin v. Löwis <martin@v.loewis.de>
.. sectionauthor:: Martin v. Löwis <martin@v.loewis.de>

**Source code:** :source:`Lib/stringprep.py`

--------------

When identifying things (such as host names) in the internet, it is often
necessary to compare such identifications for "equality". Exactly how this
comparison is executed may depend on the application domain, e.g. whether it
should be case-insensitive or not. It may be also necessary to restrict the
possible identifications, to allow only identifications consisting of
"printable" characters.

:rfc:`3454` defines a procedure for "preparing" Unicode strings in internet
protocols. Before passing strings onto the wire, they are processed with the
preparation procedure, after which they have a certain normalized form. The RFC
defines a set of tables, which can be combined into profiles. Each profile must
define which tables it uses, and what other optional parts of the ``stringprep``
procedure are part of the profile. One example of a ``stringprep`` profile is
``nameprep``, which is used for internationalized domain names.

The module :mod:`stringprep` only exposes the tables from :rfc:`3454`. As these
tables would be very large to represent as dictionaries or lists, the
module uses the Unicode character database internally. The module source code
itself was generated using the ``mkstringprep.py`` utility.

As a result, these tables are exposed as functions, not as data structures.
There are two kinds of tables in the RFC: sets and mappings. For a set,
:mod:`stringprep` provides the "characteristic function", i.e. a function that
returns ``True`` if the parameter is part of the set. For mappings, it provides the
mapping function: given the key, it returns the associated value. Below is a
list of all functions available in the module.


.. function:: in_table_a1(code)

   Determine whether *code* is in tableA.1 (Unassigned code points in Unicode 3.2).


.. function:: in_table_b1(code)

   Determine whether *code* is in tableB.1 (Commonly mapped to nothing).


.. function:: map_table_b2(code)

   Return the mapped value for *code* according to tableB.2 (Mapping for
   case-folding used with NFKC).


.. function:: map_table_b3(code)

   Return the mapped value for *code* according to tableB.3 (Mapping for
   case-folding used with no normalization).


.. function:: in_table_c11(code)

   Determine whether *code* is in tableC.1.1  (ASCII space characters).


.. function:: in_table_c12(code)

   Determine whether *code* is in tableC.1.2  (Non-ASCII space characters).


.. function:: in_table_c11_c12(code)

   Determine whether *code* is in tableC.1  (Space characters, union of C.1.1 and
   C.1.2).


.. function:: in_table_c21(code)

   Determine whether *code* is in tableC.2.1  (ASCII control characters).


.. function:: in_table_c22(code)

   Determine whether *code* is in tableC.2.2  (Non-ASCII control characters).


.. function:: in_table_c21_c22(code)

   Determine whether *code* is in tableC.2  (Control characters, union of C.2.1 and
   C.2.2).


.. function:: in_table_c3(code)

   Determine whether *code* is in tableC.3  (Private use).


.. function:: in_table_c4(code)

   Determine whether *code* is in tableC.4  (Non-character code points).


.. function:: in_table_c5(code)

   Determine whether *code* is in tableC.5  (Surrogate codes).


.. function:: in_table_c6(code)

   Determine whether *code* is in tableC.6  (Inappropriate for plain text).


.. function:: in_table_c7(code)

   Determine whether *code* is in tableC.7  (Inappropriate for canonical
   representation).


.. function:: in_table_c8(code)

   Determine whether *code* is in tableC.8  (Change display properties or are
   deprecated).


.. function:: in_table_c9(code)

   Determine whether *code* is in tableC.9  (Tagging characters).


.. function:: in_table_d1(code)

   Determine whether *code* is in tableD.1  (Characters with bidirectional property
   "R" or "AL").


.. function:: in_table_d2(code)

   Determine whether *code* is in tableD.2  (Characters with bidirectional property
   "L").

