โมดูล unicodedata ให้เข้าถึง Unicode Character Database (UCD) คุณสมบัติของทุก Unicode Character
import unicodedata
ฟังก์ชันหลัก
| Function | คำอธิบาย |
|---|---|
lookup(name) | หา Character จากชื่อ (เช่น 'LATIN CAPITAL LETTER A') |
name(chr[, default]) | ชื่อ Character (Raise ValueError ถ้าไม่มี) |
decimal(chr[, default]) | Decimal Digit Value (0-9) |
digit(chr[, default]) | Digit Value (รวม Non-decimal) |
numeric(chr[, default]) | Numeric Value (รวม Fractions) |
category(chr) | General Category (2-letter Code) |
bidirectional(chr) | Bidirectional Class |
mirrored(chr) | Mirrored Property (1/0) |
east_asian_width(chr) | East Asian Width (W, F, H, Na, A, N) |
combining(chr) | Combining Class (0 = Non-combining) |
normalize(form, str) | Unicode Normalization (NFC, NFD, NFKC, NFKD) |
General Categories
| Major | Minor | คำอธิบาย |
|---|---|---|
| L (Letter) | Lu | Uppercase |
| Ll | Lowercase | |
| Lt | Titlecase | |
| Lm | Modifier | |
| Lo | Other | |
| M (Mark) | Mn/Mc/Me | Non-spacing/Spacing/Enclosing |
| N (Number) | Nd/Nl/No | Decimal/Letter/Other |
| P (Punctuation) | Pc/Pd/Ps/Pe/Pi/Pf/Po | Connector/Dash/Open/Close/Initial/Final/Other |
| S (Symbol) | Sm/Sc/Sk/So | Math/Currency/Modifier/Other |
| Z (Separator) | Zs/Zl/Zp | Space/Line/Paragraph |
| C (Other) | Cc/Cf/Co/Cn | Control/Format/Private/Unassigned |
โค้ดตัวอย่าง
import unicodedata as ud
# Lookup by Name
print(ud.lookup('ASTERISK')) # *
print(ud.lookup('LATIN CAPITAL LETTER G')) # G
# Name from Char
print(ud.name('x')) # LATIN SMALL LETTER X
print(ud.name('°')) # DEGREE SIGN
# Numeric Values
print(ud.decimal('6')) # 6
print(ud.numeric('9')) # 9.0
print(ud.numeric('½')) # 0.5
print(ud.digit('Ⅷ')) # 8 (Roman Numeral)
# Category
print(ud.category('A')) # Lu (Letter, Uppercase)
print(ud.category('9')) # Nd (Number, Decimal Digit)
print(ud.category('[')) # Ps (Punctuation, Open)
# Mirrored
print(ud.mirrored('A')) # 0
print(ud.mirrored('(')) # 1
print(ud.mirrored(')')) # 1
# Bidirectional
print(ud.bidirectional('A')) # L (Left-to-Right)
print(ud.bidirectional('א')) # R (Right-to-Left)
# East Asian Width
print(ud.east_asian_width('A')) # Na (Narrow)
print(ud.east_asian_width('あ')) # W (Wide)
# Normalization
s = 'café' # NFC: é = U+00E9
s_nfd = ud.normalize('NFD', s) # NFD: e + ́ (U+0301)
s_nfc = ud.normalize('NFC', s_nfd)
print(f"NFC: {s_nfc}, NFD: {s_nfd}, Equal: {s_nfc == s}")
ผลลัพธ์
* G LATIN SMALL LETTER X DEGREE SIGN 6 9.0 0.5 8 Lu Nd Ps 0 1 L R Na W NFC: café, NFD: café, Equal: True
การประยุกต์ใช้จริง
- Input Validation: ตรวจสอบ Character Categories
- Text Processing: Normalization (NFC/NFKC) ก่อน Compare/Store
- Security: Detect Homoglyphs, Confusables (ใช้
unicodedata.normalize('NFKC', ...)) - Rendering: East Asian Width สำหรับ Terminal Alignment
- Search/Indexing: Case-folding + Normalization
Security: Confusable Detection
import unicodedata
def is_confusable(s1, s2):
"""Basic Confusable Check"""
return (unicodedata.normalize('NFKC', s1) ==
unicodedata.normalize('NFKC', s2))
# Homoglyph Attack Example
print(is_confusable('paypal.com', 'раypаl.com')) # True (Cyrillic 'а' vs Latin 'a')
# Better: Use unicode-security library or ICU