LOLYO-Export: typografische Zeichen auf ASCII
All checks were successful
CI / Lint, Typen, Tests, Build (push) Successful in 11m21s
CI / Migrationen auf leerer Datenbank (push) Successful in 10m10s

Der Gedankenstrich kam im Zielsystem als "–" an -- seine UTF-8-Bytes, gelesen
als Windows-1252. Nachgemessen hat die Vorlage des Anbieters dieselbe Kodierung
wie unsere Datei: UTF-8 ohne BOM, zu sehen an dem "bestätigt" in ihrer
Kopfzeile. Die Ursache liegt also nicht in dem, was wir schreiben, und solange
sie nicht geklaert ist, geht der Weg ueber das Zeichen selbst: ein Bindestrich
sagt dasselbe und ist in beiden Kodierungen dasselbe Byte.

Gilt fuer jede Zelle aus den Daten, nicht nur fuer die Position -- aufgefallen
ist es dort, weil die Taetigkeiten einen Gedankenstrich fuehren, aber dieselben
Zeichen stehen auch in Namen und Titeln.

Zwei Ausnahmen: Umlaute bleiben, weil "Baeckerei" ein Problem verstecken wuerde,
das dann auch Namen betraefe. Und das Passwort bleibt Zeichen fuer Zeichen, wie
es ist -- ein ersetztes Zeichen faellt niemandem auf, es gibt dann nur ein
Konto, in das niemand hineinkommt.
This commit is contained in:
2026-09-28 14:05:41 +02:00
parent 8ac4df17c1
commit 771020af72
2 changed files with 77 additions and 7 deletions

View File

@@ -9,6 +9,7 @@ import {
LOLYO_SPALTEN,
LOLYO_SPRACHE,
lolyoSpalten,
ohneTypografie,
type LolyoQuelle,
} from "@/lib/lolyo";
@@ -107,6 +108,42 @@ describe("Die Zuordnung", () => {
});
});
describe("Typografische Zeichen", () => {
it("weichen dem Bindestrich", () => {
// Der Gedankenstrich kam im Zielsystem als „–" an. Ein Bindestrich sagt
// dasselbe und ist in beiden Kodierungen dasselbe Byte.
expect(ohneTypografie("Angestellte/r – F&E")).toBe("Angestellte/r - F&E");
expect(ohneTypografie("Lehrling — Wolkersdorf")).toBe("Lehrling - Wolkersdorf");
});
it("gelten für Anführungszeichen, Auslassungspunkte und geschützte Leerzeichen", () => {
expect(ohneTypografie("„Schnitte“")).toBe('"Schnitte"');
expect(ohneTypografie("O’Brien")).toBe("O'Brien");
expect(ohneTypografie("und so weiter …")).toBe("und so weiter ...");
expect(ohneTypografie("W 17")).toBe("W 17");
});
it("lassen Umlaute in Ruhe", () => {
// „Bäckerei" zu „Baeckerei" zu machen hiesse, ein Problem zu verstecken,
// das dann auch Namen beträfe — und dort wäre es keine Kosmetik mehr.
expect(ohneTypografie("Arbeiter/in – Bäckerei")).toBe("Arbeiter/in - Bäckerei");
expect(ohneTypografie("Müller-Weiß")).toBe("Müller-Weiß");
});
it("gelten für jede Zelle aus den Daten, nicht nur für die Position", () => {
const z = zeile({ job_title: "Angestellte/r – F&E", last_name: "O’Brien", title_suffix: ["M–A"] });
expect(z.Position).toBe("Angestellte/r - F&E");
expect(z.Nachname).toBe("O'Brien");
expect(z["Title Suffix"]).toBe("M-A");
});
it("gelten nicht für das Passwort", () => {
// Ein ersetztes Zeichen fiele niemandem auf — es gäbe nur ein Konto, in
// das niemand hineinkommt.
expect(baueLolyoZeile(person(), "Pass–wort–2026").Passwort).toBe("Pass–wort–2026");
});
});
describe("Die Datei", () => {
it("ist semikolongetrennt und ohne BOM", () => {
// Das BOM hinge unsichtbar am Namen der ersten Spalte, und