Skip to content

File identity guide

File Name and Path Normalization Evidence: Keep Raw Names and Derived Keys Together

A file name can change identity when Unicode forms, separators, case rules, percent encoding, or dot segments are normalized. Preserve the raw name and every derived key before matching archive members or export files.

A path review keeps the raw byte or string representation beside each derived comparison key. Record Unicode normalization form, separator policy, dot-segment handling, percent-decoding scope, case policy, platform assumptions, and collision results. A normalized match is a deterministic comparison result, not proof that two files are the same artifact, that a path is safe to extract, or that an export may be shared. The RFC and Unicode dates shown here are verified source dates; no additional publication date is asserted.

  • RFC 3986 defines URI components and the distinction between syntax and data, so URI percent encoding and a local filesystem path should not be normalized as if they were one namespace. RFC Editor, (opens in a new tab)
  • Unicode UAX #15 describes normalization forms and notes that normalized strings can have a unique binary representation under the chosen form, but the choice still belongs in the comparison contract. Unicode Consortium, (opens in a new tab)

Updated

On this page

Keep raw names beside comparison keys

Store the raw path or name exactly as received, then record each derived key with the policy that produced it. A normalized key is useful for comparison, but it is not a replacement for the raw representation. Keep separators, leading markers, dot segments, percent sequences, case, and bytes visible as separate fields. If the source only exposes a decoded string, mark raw-byte evidence unavailable.

The same text can be a filesystem path, an archive member name, a URI reference, or a display label. RFC 3986 defines URI syntax and components RFC Editor, (opens in a new tab), but a URI path is not automatically a host filesystem path. Name the namespace before applying a normalization rule.

Keep raw names beside comparison keys (table)
Identity fieldRecordStop when
raw nameexact string or byte referenceOnly a rendered label remains
namespacefilesystem, archive, URI, or displayNamespace is inferred
separatorslash, backslash, or literal characterSeparators were replaced silently
dot segmentsraw and resolved formResolution changes scope
case policysensitive, insensitive, or unknownPlatform default is assumed
derived keypolicy, form, and outputKey replaces the raw name

Choose a Unicode normalization form

Unicode permits canonically equivalent strings to have different code-point sequences. UAX #15 defines normalization forms and explains why a chosen normalized representation can make equivalent strings comparable Unicode Consortium, (opens in a new tab). Record the form, Unicode version if relevant, and whether normalization applies to the whole path or only a component. Do not normalize opaque identifiers without an owner-approved policy.

A normalization collision is not evidence that the files are identical. Two distinct raw names may produce one comparison key, while a system may preserve both or reject the collision. Keep a collision table with raw values redacted or represented by stable evidence ids.

Choose a Unicode normalization form (table)
PolicyQuestionCollision risk
NFC or NFDWhich canonical form is required?Equivalent names may collapse
NFKC or NFKDAre compatibility characters allowed to merge?Meaningful distinctions may change
path componentNormalize each component or full path?Separator or slash behavior differs
Unicode versionWhich normalization tables apply?Runtime versions differ
opaque identifierIs normalization forbidden?Key identity can change
collision actionreject, disambiguate, or retain both?One key silently overwrites

Separate URI encoding from filesystem rules

Percent encoding is a URI representation rule, not a universal filesystem decoding instruction. Dot segments such as dot and dot-dot can change a URI reference or a path resolution result, while a literal file name may intentionally contain those characters. Record whether a key is decoded, resolved, or merely compared as text. Never call a normalized string safe for extraction without a separate containment review.

Case folding and separator conversion are platform policies. A case-insensitive comparison can make two raw names collide; converting a backslash to a slash can change a literal name or an escape convention. Link to the archive member path guide when archive extraction is in scope, and preserve the raw archive member separately.

Namespace questions

  • Is this value a URI reference, a local path, an archive member, or display text?
  • Does percent decoding happen once, never, or under a declared rule?
  • Are dot segments resolved for comparison or retained as literal characters?
  • Is case folding locale-independent and versioned?
  • Can a derived key collide, and what is the explicit disposition?

Use a collision fixture before matching files

The fixture below uses two visibly similar names and separate namespace examples. It is a text ledger, not a path resolver. Record the raw identifiers, the normalization form, the derived key, and the collision action. Add a percent-encoded URI example and a literal archive member to ensure the worksheet does not merge namespaces.

Do not include customer names, real directory paths, hostnames, or private archive members in a public example. A synthetic accent, separator, and dot-segment case is enough to test whether raw names survive the comparison.

Use a collision fixture before matching files (table)
Synthetic findingDispositionNext evidence
A and B share NFC keycollisionRetain both raw ids or reject
Dot segment changes resolved pathpolicy-dependentRecord raw and resolved forms
Percent encoding is undecidedholdChoose URI decoding rule
Case fold creates one keycollisionApply owner disposition
Namespace differsdo not mergeCompare only within namespace

Synthetic path identity ledger

Use a collision fixture before matching files code example, Plain text
raw A: cafe\u0301.txt | namespace: filesystem | key NFC: café.txt
raw B: café.txt | namespace: filesystem | key NFC: café.txt
raw C: /a/../b.txt | namespace: URI reference | resolved key: /b.txt
raw D: a%2Fb.txt | namespace: URI reference | decode: policy required
disposition: collision A/B retained; C/D not compared as filesystem names

Report matching without identity overclaim

Say “derived keys collide under NFC” or “raw values match after the declared case policy.” Do not say that normalized names prove identical files. A content hash, file size, archive context, and capture boundary answer different identity questions and should be recorded separately when needed.

Keep normalization evidence distinct from path traversal or extraction safety. A normalized path may still be outside an intended root, and a safe containment check does not establish that the file is the expected business artifact. Record unknown platform behavior explicitly.

Report matching without identity overclaim (table)
FindingDispositionDo not infer
Raw names match exactly in one namespacebounded matchFiles have identical bytes
Keys collide after normalizationhold or disambiguateOne file can overwrite the other
URI and filesystem forms differseparate namespacesDecoded URI is a local path
Dot segments unresolvedhold path comparisonResolved scope is safe
Case policy unavailablemeasurement limitationNames are distinct

Close with a qualified preparation step

Once raw names, namespace, Unicode form, separators, dot segments, case policy, derived keys, and collisions are recorded, keep the packet at identity evidence level. Use the data provenance log for copies and transformations and the data card for scope. Do not upload a private directory or archive merely to test normalization.

For a supported non-health collection, with authority to describe the artifact names and a controlled handling boundary, the qualified appraisal path may be a next preparation step. It does not resolve paths, compare files, create a quote, match a buyer, issue a legal opinion, or grant a license. A normalized key is not proof of ownership, permission, or identical content.

Takeaways

  • Preserve raw names and derived keys as separate evidence.
  • Name the namespace before applying URI, filesystem, or archive rules.
  • Record Unicode form, version, case, separators, and dot-segment policy.
  • Treat normalization collisions as an explicit disposition.
  • Keep identity matching separate from extraction safety, rights, and content hashes.

Sources

  1. RFC Editor: Uniform Resource Identifier (URI): Generic Syntax (opens in a new tab)
  2. Unicode Consortium: Unicode Normalization Forms (opens in a new tab)

Use the appraisal path after the technical packet is organized.

It does not parse files, certify evidence, create a quote, match a buyer, issue a legal opinion, or grant a license.