# `stringprep` --- 網際網路字串的準備

原始碼：Lib/stringprep.py

在網際網路上識別事物（例如主機名稱）時，通常需要比較這些識別器的「相等性 (equality)」。比較的具體執行方式可能取決於應用程式領域，例如是否應該不區分大小寫。也可能有必要限制可能的識別器，只允許由「可列印 (printable)」字元組成的識別器。

RFC 3454 定義了在網際網路通訊協定中「準備」Unicode 字串的程序。在傳送字串到網路之前，先使用準備程序處理字串，之後字串就具有特定的規範化 (normalized) 形式。RFC 定義了一系列的表，這些表可以組合成設定檔 (profile)。每個設定檔必須定義它使用哪些表以及 `stringprep` 程序的哪些其他可選部分是設定檔的一部分。`stringprep` 配置文件的一個例子是 `nameprep`，它被用於國際化網域名稱。

`stringprep` 模組只開放 RFC 3454 中的表。由於這些表如果以字典或串列的方式來表示的話會非常大，因此模組內部使用 Unicode 字元資料庫。模組原始碼本身是使用 `mkstringprep.py` 工具來產生的。

因此，這些表是以函式而非資料結構的形式呈現。RFC 中有兩種表：集合 (sets) 和對映 (mappings)。對於集合，`stringprep` 提供了「特徵函式 (characteristic function)」，也就是如果參數是集合的一部分就回傳 `True` 的函式。對於對映，它提供了對映函式：給定鍵，它會回傳相關的值。以下是模組中所有可用函式的清單。

stringprep.in_table_a1(code)

  判斷 code 是否在 tableA.1（Unicode 3.2 中未指定的編碼位置 (code point)）中。

stringprep.in_table_b1(code)

  判斷 code 是否在 tableB.1（通常沒有對映到任何東西）中。

stringprep.map_table_b2(code)

  根據 tableB.2（使用 NFKC 形式的大小寫折疊 (case-folding) 對映）回傳 code 的對映值。

stringprep.map_table_b3(code)

  根據 tableB.3（使用沒有規範化的大小寫折疊對映）回傳 code 的對映值。

stringprep.in_table_c11(code)

  判斷 code 是否在 tableC.1.1（ASCII 空格字元）中。

stringprep.in_table_c12(code)

  判斷 code 是否在 tableC.1.2（非 ASCII 空格字元）中。

stringprep.in_table_c11_c12(code)

  判斷 code 是否在 tableC.1（空格字元，為 C.1.1 和 C.1.2 的聯集）中。

stringprep.in_table_c21(code)

  判斷 code 是否在 tableC.2.1（ASCII 控制字元）中。

stringprep.in_table_c22(code)

  判斷 code 是否在 tableC.2.2（非 ASCII 控制字元）中。

stringprep.in_table_c21_c22(code)

  判斷 code 是否在 tableC.2（控制字元，為 C.2.1 和 C.2.2 的聯集）中。

stringprep.in_table_c3(code)

  判斷 code 是否在 tableC.3（私有使用）中。

stringprep.in_table_c4(code)

  判斷 code 是否在 tableC.4（非字元編碼位置）中。

stringprep.in_table_c5(code)

  判斷 code 是否在 tableC.5（代理碼）中。

stringprep.in_table_c6(code)

  判斷 code 是否在 tableC.6（不適用於純文字）中。

stringprep.in_table_c7(code)

  判斷 code 是否在 tableC.7（不適用於規範表示法 (canonical representation)）中。

stringprep.in_table_c8(code)

  判斷 code 是否在 tableC.8（變更顯示屬性或已棄用）中。

stringprep.in_table_c9(code)

  判斷 code 是否在 tableC.9（標記字元 (tagging characters)）中。

stringprep.in_table_d1(code)

  判斷 code 是否在 tableD.1（具有雙向屬性 "R" 或 "AL" 的字元）中。

stringprep.in_table_d2(code)

  判斷 code 是否在 tableD.2（具有雙向屬性 "L" 的字元）中。