Özellikler

Uyumluluk denkliği

Aynı soyut içeriğe sahip ancak görünümde farklılık gösterebilen iki karakter dizisi. Kanonik eşdeğerlikten daha geniştir. Örnek: fi ≈ fi, ² ≈ 2.

· Updated

What Is Compatibility Equivalence?

Two Unicode strings are compatibility equivalent if they represent semantically similar content but may differ in appearance or formatting. Compatibility equivalence is weaker than canonical equivalence: canonically equivalent strings are always compatibility equivalent, but not vice versa.

Common compatibility equivalences include:

  • The ligature (U+FB01, fi LIGATURE) ≈ fi (f + i separately)
  • The superscript ² (U+00B2) ≈ 2 (U+0032)
  • The fullwidth (U+FF21) ≈ A (U+0041)
  • The fraction ½ (U+00BD) in NFKD → 1 ⁄ 2 (sequence of three characters)
  • The circled digit (U+2460) ≈ 1 (U+0031)

Compatibility Normalization Forms

Form Description
NFKD Apply compatibility decomposition; apply canonical ordering
NFKC Apply NFKD, then canonically compose
import unicodedata

examples = [
    ("\uFB01", "fi ligature"),         # fi
    ("\u00B2", "superscript 2"),       # ²
    ("\uFF21", "fullwidth A"),         # A
    ("\u2460", "circled digit 1"),     # ①
    ("\u00BD", "vulgar fraction 1/2"), # ½
]

for char, label in examples:
    nfc  = unicodedata.normalize("NFC",  char)
    nfkc = unicodedata.normalize("NFKC", char)
    nfd  = unicodedata.normalize("NFD",  char)
    nfkd = unicodedata.normalize("NFKD", char)
    print(f"  {char}  ({label})")
    print(f"    NFC  len={len(nfc)}   NFKC={nfkc!r} len={len(nfkc)}")
    print(f"    NFD  len={len(nfd)}   NFKD={[f'U+{ord(c):04X}' for c in nfkd]}")

# fi  NFC len=1  NFKC='fi' len=2
# ²  NFC len=1  NFKC='2'  len=1
# A  NFC len=1  NFKC='A'  len=1
# ①  NFC len=1  NFKC='1'  len=1

When to Use NFKC vs NFC

Use NFC when you want to preserve formatting distinctions: a superscript 2 and a plain 2 are different in a math formula. Use NFKC when you want semantic comparison, ignoring presentational variants: a search engine should return results for "fi" when the user types "file". Python uses NFKC for identifier normalization (PEP 3131), so file and file are the same identifier in Python 3.

Caution: NFKC is lossy. Applying it to produces 22, discarding the superscript meaning. Never apply NFKC to content where formatting carries semantic information.

Quick Facts

Property Value
Concept Compatibility equivalence
Normalization forms NFKD, NFKC
Python function unicodedata.normalize("NFKC", s) / "NFKD"
Lossy? Yes — formatting distinctions are discarded
Python identifier normalization NFKC (PEP 3131)
Search engine use NFKC for case-folded token normalization
Spec reference Unicode Standard Annex #15 (UAX #15)

İlgili Terimler

Özellikler içinde daha fazlası