Formulierung einer Anforderung zu Dateinamencodierungen

12

Ich bin gerade dabei, eine Anforderungsspezifikation zu schreiben, und ich habe ein Dilemma bei der Formulierung eines Teils der Anforderungen.

Szenario: Wir laden Dateien von einer Website herunter und die heruntergeladenen Dateien müssen an ein Element in unserem CM-Tool angehängt werden. Die heruntergeladenen Dateien enthalten Namen, die ASCII, ISO-8859-1, Japanisch usw. sein können.

Deckt "Nicht-ASCII" in der folgenden Formulierung alle Situationen ab?

Der heruntergeladene Dateiname kann Nicht-ASCII-Zeichen enthalten, und die Verarbeitung dieser Zeichen führt nicht zum Absturz der Anwendung

KK99
quelle
Von einer Website oder von vielen Websites? Enthält diese eine Website wirklich ein Gobbledegook-Dateisystem?
200_success
7
also, wenn der Dateiname ASCII enthält, darf die Anwendung abstürzen;)
jk.
11
Wäre es pedantisch, darauf hinzuweisen, dass "Japanisch" keine Kodierung ist?
Ixrec
@lxrec -> Sie sind richtig. Japanisch ist keine Kodierung. Was ich sagen wollte, waren japanische Zeichen, die aber nicht vollständig durchgetippt wurden. Danke
KK99
@jk In einigen Implementierungen stürzt die Anwendung ab, wenn der Dateiname nicht ASCII ist. wahre geschichte :-)
KK99

Antworten:

30

Die Anforderung ist für mich, wie gesagt, unscharf.

Die erste Frage, die ich hätte, lautet: Wie viele Zeichenkodierungen müssen unterstützt werden? Mögliche Interpretationen sind:

  1. Jede Codierung, die jemals entwickelt wurde, einschließlich Einzelbyte (z. B. ISO-8859-15 ), Multibyte (z. B. Big5 , Shift-JIS , HZ ) und seltene / seltsame (z. B. UTF-7 , Punycode , EBCDIC ).
  2. Das ist offensichtlich extrem. Wie wäre es mit nur der minimalen Unterstützung, nämlich ISO-8859-1?
  3. Nur ISO-8859-1 scheint wieselhaft. Wie wäre es, nur moderne Best Practices zu unterstützen, nämlich Unicode als UTF-8 ?

Wenn Sie nicht angeben, welche Codierungen Sie meinen, haben Sie und der Implementierer möglicherweise einen Streit, wenn ein codierungsspezifischer Fehler auftritt, und Sie haben beide Recht. Das ist per definitionem die Konsequenz einer Fuzzy-Spezifikation.

Was muss die Software mit dem Dateinamen tun, abgesehen davon, dass sie nicht abstürzt? Sollte es…

  1. Beibehalten des Dateinamens in seiner ursprünglichen Codierung, Byte für Byte?
  2. Alles auf Unicode normalisieren? Wenn ja, muss die Quellcodierung automatisch erkannt werden? Nach welchem ​​Mechanismus?
  3. Speichern Sie sowohl das Unicode-Formular als auch das Original, falls die Normalisierung fehlschlägt.

Eine bessere Version Ihrer Anforderung wäre

Der Downloader muss Dateinamen in verschiedenen Codierungen unterstützen, einschließlich mindestens ASCII, ISO-8859-1, ISO-8859-15, KOI8-R, UTF-8, Shift-JIS, EUC-JP, GB2312 und Big5. Wenn die Webserverantwort eine Codierung angibt, muss diese eingehalten werden. (Wenn die Codierung nicht angegeben ist, wird möglicherweise ISO-8859-1 angenommen oder es wird eine bessere Vermutung angestellt.) Die Dateinamen werden im Content-Management-System zu einer Unicode-Darstellung normalisiert.

Die spezifischen Beispiele der erforderlichen Codierungen sind für die Erstellung von Akzeptanzkriterien von wesentlicher Bedeutung. Die hinzugefügten Sätze geben an, was die Software tun muss, abgesehen davon, dass sie nicht abstürzt.

200_erfolg
quelle
Während NTFS Dateinamen in Unicode speichert, speichern die meisten anderen Dateisysteme Dateinamen als Byte-Streams ohne festgelegte Codierung. Woher wissen Sie in diesem Fall überhaupt, welche Codierung zu erraten ist?
Gabe
@Gabe Wenn der Webserver die Datei bereitstellt, gibt er möglicherweise die Codierung an. Wenn nicht, gibt es auch Heuristiken für die Textanalyse, die eine Kodierung erraten können.
200_success
2
Denken Sie daran, wir sprechen über den Dateinamen selbst, nicht über den Inhalt der Datei. Wahrscheinlich hat der Webserver keine Möglichkeit, die Kodierung des Dateinamens zu ermitteln. Wenn also behauptet wird, dass sich der Dateiname in einer bestimmten Kodierung befindet, liegt dies wahrscheinlich an. Wenn Sie versuchen, von UTF-8 nach UTF-16 zu konvertieren, der Dateiname jedoch ISO-8859-1 lautet, kommt es wahrscheinlich zu einem Absturz. Unter blogs.msdn.com/b/oldnewthing/archive/2007/04/17/2158334.aspx finden Sie außerdem ein Beispiel dafür, wie schlecht Heuristiken sind, um Codierungen aus Beispielen mit Dateinamengröße zu erraten.
Gabe
@Gabe Beachten Sie, dass ich ISO-8859-1 als Standard vorgeschlagen habe. Es gibt einen Grund dafür - es vermeidet viele der Gefahren, die Sie erwähnen.
200_success
Ich befürchte, dass UTF-8 nicht ausreicht - zumindest in einigen Windows-Versionen (FAT-Dateisysteme?) Erhalten Sie Dateinamen in den lokalen Nicht-Unicode-Codierungen - z. B. win-1252 oder win-1257; Der Browser konvertiert möglicherweise die Dateinamen beim Hochladen in utf-8, aber ich bezweifle es.
Peteris
14

Die Anforderung, die Sie geschrieben haben, weist nicht die Merkmale einer guten Anforderung auf . Insbesondere ist es nicht zusammenhängend, es ist nicht atomar und es ist nicht eindeutig. Aufgrund des Fehlens dieser Eigenschaften ist es auch nicht leicht zu überprüfen.

Ihre anfängliche Statusanforderung ist:

Der heruntergeladene Dateiname kann Nicht-ASCII-Zeichen enthalten, und die Verarbeitung dieser Zeichen führt nicht zum Absturz der Anwendung

Ich würde empfehlen, die entfernen "... und die Verarbeitung dieser soll die Anwendung nicht zum Absturz bringen". Wenn Sie die Anforderung haben, dass eine Software etwas tun muss, ist es meines Erachtens in Ordnung, davon auszugehen, dass dies ohne Absturz der Software möglich ist.

Dies wandelt die Anforderung in:

Der heruntergeladene Dateiname kann Nicht-ASCII-Zeichen enthalten

Jetzt haben Sie eine zusammenhängende und atomare Anforderung. Ich bin mir jedoch nicht sicher, ob es eindeutig ist. In Ihrer Frage erwähnen Sie eine Reihe von verschiedenen Formaten. Es gibt einige Möglichkeiten.

Einige empfehlen eine separate und eindeutige Anforderung für jede zu unterstützende Dateinamencodierung. Dies würde am besten zusammenhängende, atomare, nachvollziehbare, eindeutige und überprüfbare Anforderungen unterstützen. Dies würde es auch einfacher machen, die Wichtigkeit jeder Anforderung zu spezifizieren - möglicherweise ist die Unterstützung einiger Codierungen wichtiger oder wird früher benötigt.

Andere empfehlen möglicherweise eine Tabelle mit unterstützten Formaten, und diese Anforderung würde auf eine Tabelle verweisen. Es wäre weniger vollständig (Sie müssen einen Textsatz und eine Tabelle pflegen), aber sie befinden sich in demselben Dokument oder derselben Datenbank. Wenn Sie jedoch eine Verknüpfung in einem Anforderungsmanagement-Tool durchführen möchten, können diese miteinander verknüpft werden, sodass Änderungen an einer Anforderung die verknüpfte Anforderung hervorheben. Es würde auch ermöglichen, dass der Text unverändert in andere Softwarepakete fließt, jedoch mit einer anderen Tabelle für unterschiedliche Codierungen.

Wie Sie die Anforderungen dokumentieren, hängt jedoch von Ihren spezifischen Anforderungen ab.

Thomas Owens
quelle
4

Es gibt einige Probleme mit Ihrer Formulierung, die die Anforderung schwächen:

1) Sie sollten die Anforderung in positiven Begriffen ausdrücken und nicht in Begriffen dessen, was sie nicht tun sollte . Wie testet man auf "nicht abstürzen".

2) Die Formulierung "Der heruntergeladene Dateiname enthält möglicherweise ..." ist vage.

Eine vorgeschlagene alternative Formulierung (natürlich rein subjektiv) könnte sein:

Die Anwendung muss heruntergeladene Dateinamen unterstützen, die Nicht-ASCII-Zeichen enthalten.

(Das Wort "Unterstützung" ist immer noch ein wenig vage und könnte geändert werden, um konkreter zu werden, wenn es mit anderen Anforderungen für Ihre Bewerbung in Einklang gebracht wird.)

Kent A.
quelle
1
Selbstkommentar: Nicht-ASCII ist auch nicht die beste Formulierung, da Nicht-ASCII jede andere Kodierung bedeuten könnte. Eine bessere Anforderung würde die zulässigen Codierungen auflisten, wodurch die resultierenden Testfälle besser feststellen können, ob die Software wie beabsichtigt funktioniert. Andernfalls könnte das Testen einer Nicht-ASCII-Codierung die Anforderung erfüllen, die Software jedoch möglicherweise nicht vollständig testen.
Kent A.
2
Geben Sie am besten an, dass die Anwendung heruntergeladene Dateinamen mit Unicode-Zeichen unterstützt, und geben Sie möglicherweise die zu unterstützende Codierung an, z. B. UTF-8.
1

Das Problem mit der Spezifikation ist, dass sie nicht sagt, was die Anwendung mit "interessanten" Dateinamen machen soll. Ich bin auf ein Programm gestoßen, das alle Dateinamenzeichen ersetzt, die es nicht verstand _, mit der Folge, dass beim Kopieren eines Verzeichnisses, das zwei Zeichen enthielt, deren Namen mit Ausnahme der Zeichen, die das Dienstprogramm nicht verstand, die zweite Datei identisch waren in das Verzeichnis geschrieben würde das erste überschreiben. Ein solches Verhalten würde sich als "nicht abstürzen" qualifizieren, aber das sollte nicht bedeuten, dass es ohne eine explizite Angabe akzeptabel ist.

Ich würde vorschlagen, dass eine gute Spezifikation positiv angibt, was passieren soll, oder ansonsten festlegt, welche Vorgehensweisen akzeptabel sind, z. B. "Wenn ein Dateiname nicht erkannte Zeichen enthält, sollte das System eine neue GUID für den Gesamtvorgang generieren und einen Dateinamen generieren Diese GUID, eine Indexnummer und ein beliebiger Teil des ursprünglichen Dateinamens werden kombiniert und es sollte eine Tabelle erstellt werden, die den alten und den neuen Dateinamen abbildet. "oder" Wenn ein Dateiname nicht erkannte Zeichen enthält, kann das System einen neuen bilden Name durch Verketten der erkannten Zeichen; wenn zwei Dateinamen durch eine solche Umwandlung identisch werden, kann einer willkürlich zum "Gewinner" erklärt werden. "

Superkatze
quelle