Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Unicode Database (โมดูล unicodedata)

โมดูล 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

MajorMinorคำอธิบาย
L (Letter)LuUppercase
LlLowercase
LtTitlecase
LmModifier
LoOther
M (Mark)Mn/Mc/MeNon-spacing/Spacing/Enclosing
N (Number)Nd/Nl/NoDecimal/Letter/Other
P (Punctuation)Pc/Pd/Ps/Pe/Pi/Pf/PoConnector/Dash/Open/Close/Initial/Final/Other
S (Symbol)Sm/Sc/Sk/SoMath/Currency/Modifier/Other
Z (Separator)Zs/Zl/ZpSpace/Line/Paragraph
C (Other)Cc/Cf/Co/CnControl/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