{"schema":"cpc-unicode-answer-v1","question":"Why can a precomposed letter fail an exact match against a letter plus a mark?","answer":"U+00E9 is the canonical composed form of U+0065 followed by U+0301. Those strings are not an exact match. Code points: U+00E9. Choosing NFC or NFD changes which scalars are stored. The runtime normalization data version is runtime-unknown. Appearance was not tested. A non-equivalent fallback is \"é\" (The canonical decomposition of U+00E9). Two scalars. An exact match against U+00E9 fails until both sides use the same form. Exact string match: no. NFC match: yes. Appearance and meaning were not tested. Font coverage, shaping, and application acceptance were not tested, so those results are unknown.","unicodeVersion":"18.0.0","purpose":"general","citation":"Do not invent a platform-support claim from this data.","page":"/answers/why-a-precomposed-letter-can-fail-an-exact-match/","markdown":"/answers/why-a-precomposed-letter-can-fail-an-exact-match.md","sample":"é","codepoints":[{"codepoint":"U+00E9","name":"LATIN SMALL LETTER E WITH ACUTE","displayLabel":"é","warnings":["canonical-equivalent"],"explanations":[{"id":"canonical-equivalent","title":"Precomposed letter and a combining mark","behavior":"U+00E9 is the canonical composed form of U+0065 followed by U+0301. Those strings are not an exact match.","limitation":"Choosing NFC or NFD changes which scalars are stored. The runtime normalization data version is runtime-unknown. Appearance was not tested.","fix":"Compare code points before treating the strings as the same value. Normalize only at a boundary you control, and keep the original scalars when storage must stay unchanged.","source":"https://www.unicode.org/reports/tr44/","alternatives":[{"value":"é","reason":"The canonical decomposition of U+00E9","tradeoff":"Two scalars. An exact match against U+00E9 fails until both sides use the same form."}],"evidenceTier":"standards-informed-editorial","evidence":{"behavior":"standards-informed","compatibility":"not-tested","repair":"editorial-guidance"}}]}],"comparison":{"schema":"cpc-unicode-compare-v1","exactlyEqual":false,"sameNFC":true,"sameNFKC":true,"sameVisualAppearance":"unknown","sameMeaning":"unknown","left":{"codepoints":["U+00E9"],"graphemes":1},"right":{"codepoints":["U+0065","U+0301"],"graphemes":1},"explanation":"Normalization equivalence does not guarantee the same rendering, semantics or acceptance in an application."},"graphemes":{"status":"available","method":"runtime-intl-segmenter","unicodeDataVersion":"runtime-unknown","count":1,"segments":[{"text":"é","utf16Offset":0,"codepoints":["U+00E9"]}]},"normalizationChanged":{"NFC":false,"NFD":true,"NFKC":false,"NFKD":true},"normalizationUnicodeDataVersion":"runtime-unknown","targetCompatibility":{"status":"unknown","evidenceTier":"not-tested","purpose":"general","explanation":"No OS, font, browser, application, field policy or rendering engine was tested. Unicode validity and segmentation do not establish actual display or acceptance."}}