Pythonのstringprepモジュールで学ぶUnicode文字列の事前準備
stringprep(文字列準備)とは
インターネット上でさまざまな識別子を扱う際には、それらが等しいかどうかを比較する必要があります。しかし、比較の手順はアプリケーションの分野によって異なり、たとえば大文字と小文字を区別しないケースなども存在します。こうした情報を確認し、文字列を適切に正規化するために使われるのが stringprep(文字列準備)です。
RFC 3454では、Unicode文字列をネットワーク上へ送信する前に施すべき「準備」の手順が定義されています。この準備プロセスを経た文字列は、一定の正規化された形式を持つことになります。
RFCでは一連のテーブルが定義されており、これらのテーブルを組み合わせて「プロファイル」を作成できます。stringprepプロファイルの代表例が nameprep で、国際化ドメイン名(IDN)の処理などに利用されています。
テーブルの2つの種類
stringprepのテーブルには セット(set) と マッピング(mappings) の2種類があります。セット型のテーブルでは、指定した文字がそのテーブルに含まれていればTrueを、含まれていなければFalseを返します。一方、マッピング型のテーブルでは、キーとなるコードポイントを渡すと、それに対応する値が返されます。
このモジュールを使用するには、コード内でstringprepモジュールをインポートします。
import stringprep
stringprepの主なテーブル一覧
| 番号 | テーブルと説明 |
|---|---|
| 1 | stringprep.in_table_a1(code) Unicode 3.2における未割り当てのコードポイント |
| 2 | stringprep.in_table_b1(code) 一般的に何にもマッピングされない(削除される)文字 |
| 3 | stringprep.in_table_b2(code) テーブルB.2へのマッピング値を返す。NFKCケースフォールディング用のマッピング |
| 4 | stringprep.in_table_b3(code) 正規化を行わないケースフォールディングのマッピング |
| 5 | stringprep.in_table_c11(code) ASCII空白文字 |
| 6 | stringprep.in_table_c12(code) 非ASCII空白文字 |
| 7 | stringprep.in_table_c11_c12(code) ASCIIおよび非ASCII空白文字の組み合わせ |
| 8 | stringprep.in_table_c21(code) ASCII制御文字 |
| 9 | stringprep.in_table_c22(code) 非ASCII制御文字 |
| 10 | stringprep.in_table_c21_c22(code) ASCIIおよび非ASCII制御文字の組み合わせ |
| 11 | stringprep.in_table_c3(code) 私用目的の文字 |
| 12 | stringprep.in_table_c4(code) 非文字コードポイント |
| 13 | stringprep.in_table_c5(code) サロゲートコード |
| 14 | stringprep.in_table_c6(code) プレーンテキストに不適切な文字 |
| 15 | stringprep.in_table_c7(code) 正準表現に不適切な文字 |
| 16 | stringprep.in_table_c8(code) 表示特性を変化させるコード |
| 17 | stringprep.in_table_c9(code) タグ付け文字 |
| 18 | stringprep.in_table_d1(code) 双方向プロパティが「R」または「AL」である文字 |
| 19 | stringprep.in_table_d2(code) 双方向プロパティが「L」である文字 |
サンプルコード
import stringprep as sp
print('\u0020') # 空白文字を出力
print(sp.in_table_c11('\u0020')) # ASCII空白文字に含まれるためTrue
print(sp.in_table_d2('L')) # 文字Lは左から右への双方向プロパティを持つためTrue
print(sp.in_table_d1('L')) # 文字Lは右から左への双方向プロパティを持たないためFalse
実行結果
True True False
-
Pythonのcasefold()メソッドとは?文字列の小文字変換と比較方法を解説
Pythonのcasefold()は、文字列内の英字をすべて小文字に変換するためのメソッドです。lower()と似ていますが、より積極的な変換を行う点が特徴で、ドイツ語の「ß」が「ss」に変換されるなど、国際化対応において強力な働きをします。2つの文字列に対してcasefold()を適用すれば、大文字・小文字の違いを無視して値を一致させることができます。そのため、ユーザー入力の比較や検索処理などで非常に役立ちます。casefold()の基本的な使い方次の例では、文字列にcasefold()を適用し、すべて小文字に変換された結果を出力しています。コード例string = BestTutorial
-
【Python】文字列として書かれたPythonコードを実行する方法:exec()とeval()の使い分け
exec()でPythonのステートメントを実行する 文字列として記述されたPythonのコード(ステートメント)を実際に実行したい場合は、組み込み関数のexec()を使用します。引数に渡された文字列がPythonのコードとして解釈され、その場で実行されます。 >>> my_code = print(Hello World!) >>> exec(my_code) Hello World! 上記の例では、変数my_codeに格納された文字列がexec()によってコードとして評価され、「Hello World!」が出力されています。 eval()で式の値を評価