stringprep --- آماده‌سازی رشته‌های اینترنتی

کد منبع: Lib/stringprep.py


هنگام شناسایی چیزها (مانند نام‌های میزبان) در اینترنت، اغلب لازم است چنین شناسه‌هایی را از نظر «برابری» مقایسه کنید. این‌که دقیقاً این مقایسه چگونه اجرا می‌شود، ممکن است به حوزه کاربرد بستگی داشته باشد؛ مثلاً این‌که باید بدون حساسیت به حروف کوچک و بزرگ باشد یا نه. همچنین ممکن است لازم باشد شناسه‌های ممکن را محدود کنید تا فقط شناسه‌هایی که از نویسه‌های «چاپ‌پذیر» تشکیل شده‌اند مجاز باشند.

RFC 3454 یک رویه برای «آماده‌سازی» رشته‌های یونیکد در پروتکل‌های اینترنتی تعریف می‌کند. پیش از ارسال رشته‌ها روی سیم، آن‌ها با رویه آماده‌سازی پردازش می‌شوند و پس از آن دارای شکل هنجارشده معینی هستند. این RFC مجموعه‌ای از جدول‌ها را تعریف می‌کند که می‌توان آن‌ها را در قالب پروفایل‌ها ترکیب کرد. هر پروفایل باید مشخص کند که از کدام جدول‌ها استفاده می‌کند و چه بخش‌های اختیاری دیگری از رویه stringprep جزئی از آن پروفایل هستند. یکی از پروفایل‌های stringprep، nameprep است که برای نام‌های دامنه بین‌المللی استفاده می‌شود.

ماژول stringprep فقط جدول‌های RFC 3454 را ارائه می‌دهد. از آنجا که بازنمایی این جدول‌ها به‌صورت دیکشنری یا فهرست بسیار حجیم خواهد بود، این ماژول به‌صورت داخلی از پایگاه داده نویسه‌های یونیکد استفاده می‌کند. خود کد منبع ماژول با استفاده از ابزار mkstringprep.py تولید شده است.

در نتیجه، این جداول به‌عنوان توابع ارائه می‌شوند، نه به‌عنوان ساختارهای داده. دو نوع جدول در RFC وجود دارد: مجموعه‌ها و نگاشت‌ها. برای یک مجموعه، stringprep «تابع مشخصه» را فراهم می‌کند، یعنی تابعی که اگر پارامتر عضوی از مجموعه باشد، True را برمی‌گرداند. برای نگاشت‌ها، تابع نگاشت را فراهم می‌کند: با دریافت کلید، مقدار مرتبط را برمی‌گرداند. در زیر فهرستی از همه توابع موجود در این ماژول آمده است.

stringprep.in_table_a1(code)

تعیین کنید که آیا code در tableA.1 (نقاط کد تخصیص‌نیافته در Unicode 3.2) قرار دارد یا خیر.

stringprep.in_table_b1(code)

تعیین می‌کند که آیا code در tableB.1 وجود دارد (معمولاً به هیچ‌چیز نگاشت می‌شود).

stringprep.map_table_b2(code)

مقدار نگاشت‌شده برای code را طبق tableB.2 (نگاشت برای case-folding مورد استفاده با NFKC) برمی‌گرداند.

stringprep.map_table_b3(code)

مقدار نگاشته‌شده برای code را بر اساس tableB.3 (نگاشت برای case-folding که بدون نرمال‌سازی استفاده می‌شود) برمی‌گرداند.

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 در جدول C.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 در جدول C.7 قرار دارد (نامناسب برای بازنمایی کانونیکال).

stringprep.in_table_c8(code)

تعیین می‌کند که آیا code در tableC.8 قرار دارد (ویژگی‌های نمایشی را تغییر می‌دهند یا منسوخ شده‌اند).

stringprep.in_table_c9(code)

تعیین کنید که آیا code در tableC.9 (نویسه‌های برچسب‌گذاری) قرار دارد یا خیر.

stringprep.in_table_d1(code)

تعیین کنید که آیا code در tableD.1 قرار دارد (نویسه‌هایی با ویژگی دوجهته "R" یا "AL").

stringprep.in_table_d2(code)

تعیین کنید که آیا code در tableD.2 قرار دارد (نویسه‌هایی با ویژگی دوجهته "L").