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.
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 fi (U+FB01, fi LIGATURE) ≈ fi (f + i separately)
- The superscript ² (U+00B2) ≈ 2 (U+0032)
- The fullwidth A (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 2² 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ı
Karakter için alternatif isimler; Unicode isimleri kararlılık politikası gereği değiştirilemediğinden kullanılır. Düzeltmeler, …
Bir karakterin bileşen parçalarına eşlenmesi. Kanonik ayrıştırma anlamı korur (é → e …
Birleştirme işaretlerinin kanonik ayrıştırma sırasındaki sıralamasını kontrol eden sayısal değer (0–254), hangi …
Adlandırılmış bitişik kod noktası aralığı (örneğin, Basic Latin = U+0000–U+007F). Unicode 16.0, …
Karakterleri büyük harf, küçük harf ve başlık harfi arasında dönüştürme kuralları. Yerel …
Unicode property (UAX#11) classifying characters as Narrow, Wide, Fullwidth, Halfwidth, Ambiguous, or …
Her kod noktasının 30 kategoriden birine (Lu, Ll, Nd, So, vb.) sınıflandırılması; …
Kullanıcının algıladığı 'karakter' — tek bir birim gibi hissettiren öğe. Birden fazla …
Unicode property controlling how Arabic and Syriac characters connect to adjacent characters. …
Anlamsal olarak özdeş olan ve eşit kabul edilmesi gereken iki karakter dizisi. …