| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | :mod:`stringprep` --- Internet String Preparation
 | 
					
						
							|  |  |  | =================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. module:: stringprep
 | 
					
						
							|  |  |  |    :synopsis: String preparation, as per RFC 3453
 | 
					
						
							| 
									
										
										
										
											2016-06-11 15:02:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | .. moduleauthor:: Martin v. Löwis <martin@v.loewis.de>
 | 
					
						
							|  |  |  | .. sectionauthor:: Martin v. Löwis <martin@v.loewis.de>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-11 15:02:54 -04:00
										 |  |  | **Source code:** :source:`Lib/stringprep.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | --------------
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 07:39:00 +03:00
										 |  |  | The module :mod:`stringprep` only exposes the tables from :rfc:`3454`. As these
 | 
					
						
							| 
									
										
										
										
											2023-08-27 04:26:23 -07:00
										 |  |  | tables would be very large to represent as dictionaries or lists, the
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 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
 | 
					
						
							| 
									
										
										
										
											2019-11-12 16:57:03 +02:00
										 |  |  | returns ``True`` if the parameter is part of the set. For mappings, it provides the
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 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").
 | 
					
						
							|  |  |  | 
 |