Vault-Import: Umlaute in Seitentiteln zerstört (ZIP-Dateinamen-Dekodierung) #127

Closed
opened 2026-07-15 13:00:50 +02:00 by fable-5 · 1 comment
Collaborator

Bug (Stefans echter Vault-Import auf Prod)

Beispiel: „Wenn der Fußball zum Götzen wird" → Titel mit kaputten Sonderzeichen, Slug fussball-wm-2026-wenn-der-fua-ball-zum-goi-tzen-wird.

Das Muster (ßua, öoi) zeigt auf falsch dekodierte ZIP-Dateinamen: UTF-8-Bytes (macOS zudem NFD-zerlegt) wurden als Latin-1/CP437 interpretiert — der Unzip-Pfad honoriert offenbar nur das UTF-8-Flag im ZIP-Header, das nicht jedes Tool setzt. Seitentitel entstehen aus den Dateinamen, daher landet der Mojibake im Titel; der Slug macht daraus fua/goi.

Fix: Dateinamen beim Entpacken immer als UTF-8 dekodieren (Fallback nur, wenn ungültig) und anschließend NFC-normalisieren (macOS-ZIPs liefern NFD — sonst matchen Wikilinks/Duplikat-Erkennung nicht). Fixture um einen Umlaut-Dateinamen OHNE UTF-8-Flag erweitern, Unit-Test pinnen.

Hinweis: bereits importierte Seiten (Prod, Teich stefan-waidele) behalten die kaputten Titel — nach dem Fix Teilbaum löschen und neu importieren (oder Titel per Hand/API korrigieren).

**Bug** (Stefans echter Vault-Import auf Prod) Beispiel: „Wenn der Fußball zum Götzen wird" → Titel mit kaputten Sonderzeichen, Slug `fussball-wm-2026-wenn-der-fua-ball-zum-goi-tzen-wird`. Das Muster (`ß`→`ua`, `ö`→`oi`) zeigt auf **falsch dekodierte ZIP-Dateinamen**: UTF-8-Bytes (macOS zudem NFD-zerlegt) wurden als Latin-1/CP437 interpretiert — der Unzip-Pfad honoriert offenbar nur das UTF-8-Flag im ZIP-Header, das nicht jedes Tool setzt. Seitentitel entstehen aus den Dateinamen, daher landet der Mojibake im Titel; der Slug macht daraus `fua`/`goi`. **Fix:** Dateinamen beim Entpacken immer als UTF-8 dekodieren (Fallback nur, wenn ungültig) und anschließend **NFC-normalisieren** (macOS-ZIPs liefern NFD — sonst matchen Wikilinks/Duplikat-Erkennung nicht). Fixture um einen Umlaut-Dateinamen OHNE UTF-8-Flag erweitern, Unit-Test pinnen. Hinweis: bereits importierte Seiten (Prod, Teich stefan-waidele) behalten die kaputten Titel — nach dem Fix Teilbaum löschen und neu importieren (oder Titel per Hand/API korrigieren).
fable-5 added this to the M15 — UI-Feinschliff + Import-Fix nach v0.6.0 milestone 2026-07-15 13:00:50 +02:00
fable-5 added the
backend
frontend
labels 2026-07-15 13:00:50 +02:00
Author
Collaborator

Erledigt in 78a913c.

Root Cause bestätigt: fflate dekodiert ZIP-Eintragsnamen ohne UTF-8-Flag (Bit 11) als Latin-1 — gängige Archiver setzen das Flag nicht, also kamen die UTF-8-Bytes von „Fußball"/„Götzen" als Mojibake an und landeten als Seitentitel (Slug fua-ball/goi-tzen).

Fix: Die Latin-1-Dekodierung ist byte-verlustfrei, deshalb liest parseVaultZip Namen, deren Zeichen alle in ein Byte passen, strikt als UTF-8 nach (echtes Latin-1 und flag-dekodierte Namen fallen unverändert zurück) und NFC-normalisiert anschließend — macOS-ZIPs liefern zerlegte Umlaute (NFD), was zusätzlich slugifys ä→ae-Digraphen, Wikilink-Matching und Duplikat-Erkennung brach. slugify selbst normalisiert jetzt ebenfalls vorab (Defense-in-depth für NFD aus anderen Quellen).

Unit-Tests pinnen beide Fälle (handgepatchtes ZIP ohne UTF-8-Flag; NFD-Name → präkomponierter Titel + ueber--Slug). CI grün auf 1b9dd7d.

Hinweis für deinen Prod-Teich: bereits importierte Seiten behalten die kaputten Titel — nach dem Deploy den importierten Teilbaum löschen und neu importieren (oder Titel von Hand korrigieren).

Erledigt in `78a913c`. **Root Cause bestätigt:** fflate dekodiert ZIP-Eintragsnamen ohne UTF-8-Flag (Bit 11) als Latin-1 — gängige Archiver setzen das Flag nicht, also kamen die UTF-8-Bytes von „Fußball"/„Götzen" als Mojibake an und landeten als Seitentitel (Slug `fua-ball`/`goi-tzen`). **Fix:** Die Latin-1-Dekodierung ist byte-verlustfrei, deshalb liest `parseVaultZip` Namen, deren Zeichen alle in ein Byte passen, strikt als UTF-8 nach (echtes Latin-1 und flag-dekodierte Namen fallen unverändert zurück) und **NFC-normalisiert** anschließend — macOS-ZIPs liefern zerlegte Umlaute (NFD), was zusätzlich slugifys ä→ae-Digraphen, Wikilink-Matching und Duplikat-Erkennung brach. `slugify` selbst normalisiert jetzt ebenfalls vorab (Defense-in-depth für NFD aus anderen Quellen). Unit-Tests pinnen beide Fälle (handgepatchtes ZIP ohne UTF-8-Flag; NFD-Name → präkomponierter Titel + `ueber-`-Slug). CI grün auf `1b9dd7d`. **Hinweis für deinen Prod-Teich:** bereits importierte Seiten behalten die kaputten Titel — nach dem Deploy den importierten Teilbaum löschen und neu importieren (oder Titel von Hand korrigieren).
Sign in to join this conversation.
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: stwaidele/dorfteich#127
No description provided.