Tương đương tương thích
Embed This Widget
Add the script tag and a data attribute to embed this widget.
Embed via iframe for maximum compatibility.
<iframe src="https://unicodefyi.com/iframe/glossary/compatibility-equivalence/" width="420" height="400" frameborder="0" style="border:0;border-radius:10px;max-width:100%" loading="lazy"></iframe>
Paste this URL in WordPress, Medium, or any oEmbed-compatible platform.
https://unicodefyi.com/glossary/compatibility-equivalence/
Add a dynamic SVG badge to your README or docs.
[](https://unicodefyi.com/glossary/compatibility-equivalence/)
Use the native HTML custom element.
Hai chuỗi ký tự có cùng nội dung trừu tượng nhưng có thể khác về hình thức. Rộng hơn tương đương chuẩn. Ví dụ: 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) |
Thuật ngữ liên quan
Thêm trong Thuộc tính
Tên thay thế cho các ký tự, vì tên Unicode không thể …
Các ký tự không có hiệu ứng hiển thị và có thể …
Ký tự mà người dùng cảm nhận được — điều cảm giác …
Phân loại mọi điểm mã vào một trong 30 danh mục (Lu, …
Thuộc tính xác định cách một ký tự hoạt động trong văn …
Các ký tự dùng để tổ chức và làm rõ ngôn ngữ …
Unicode property (UAX#11) classifying characters as Narrow, Wide, Fullwidth, Halfwidth, Ambiguous, or …
Cách diễn giải số của một ký tự, nếu có: giá trị …
Hệ thống chữ viết mà một ký tự thuộc về (ví dụ: …
Unicode property controlling how Arabic and Syriac characters connect to adjacent characters. …