یه نکته که خیلیها بهش فکر نمیکنن و ممکنه یه روز خیلی اذیت کنه:
هیچوقت دو تا رشته رو بدون نرمالسازی یونیکد با هم مقایسه نکن.
فکر میکنی دو تا رشته که شکلشون یکیه، پس برابرن؟ نه همیشه. مثلاً حرف «é» رو در نظر بگیر. یه بار به صورت یک کاراکتر واحد نوشته میشه (U+00E9)، یه بار هم به صورت حرف «e» به علاوه یه اکسنت ترکیبی (U+0065 + U+0301). این دو تا تو نمایش یکسان به نظر میرسن، ولی تو حافظه فرق دارن. پس == میگه برابر نیستن.
این دقیقاً کجا دردسر میشه؟ جاهایی که کاربر اسم یا ایمیل وارد میکنه. یا وقتی فایلها رو بر اساس اسم مقایسه میکنی. یا تو URLها. ممکنه کاربر نتونه لاگین کنه چون یه بار با کیبورد عربی نوشته و یه بار با کیبورد انگلیسی، یا از copy-paste استفاده کرده.
راهحلش سادهست: قبل از مقایسه، نرمالسازی کن.
import unicodedata
s1 = unicodedata.normalize('NFC', s1)
s2 = unicodedata.normalize('NFC', s2)
if s1 == s2:
...
معمولاً NFC کافیه، ولی بسته به کاربرد ممکنه NFD یا NFKC یا NFKD هم لازم بشه. (NFKC برای چیزهایی مثل «fi» که به «fi» تبدیل میشه.)
فقط یه هشدار: نرمالسازی میتونه طول رشته رو عوض کنه. پس اگه بعدش میخوای index بزنی، حواست باشه.
این نکته تو پروژههای واقعی خیلی پیش میاد، مخصوصاً وقتی با کاربرای بینالمللی طرف هستی.
@comma_code
@comma_code1
#python #programing #Comparison #comma_code #Normalization
#پایتون #برنامهنویسی #مقایسه #کاما_کد #نرمالسازی
276 · پستیه نکته که خیلیها بهش فکر نمیکنن و ممکنه یه روز خیلی اذیت کنه:
27 سپتامبر 2026در همان حوالی فید
Iاین پیام
I