Formulation d'une exigence concernant les encodages de nom de fichier

12

Je suis en train de rédiger une spécification des exigences et j'ai un dilemme à formuler une partie des exigences.

Scénario: Nous téléchargeons des fichiers à partir d'un site Web et les fichiers téléchargés doivent être joints à un élément dans l'outil CM que nous avons. Les fichiers téléchargés contiennent des noms qui peuvent être ASCII, ISO-8859-1, japonais, etc.

Dans le libellé ci-dessous, "non-ASCII" couvre-t-il toutes les situations?

Le nom du fichier téléchargé peut contenir des caractères non ASCII et le traitement de celui-ci ne fera pas planter l'application

KK99
la source
À partir d' un site Web ou de nombreux sites Web? Ce site Web contient-il vraiment un système de fichiers englouti?
200_success
7
donc si le nom du fichier contient ascii l'application est autorisée à planter;)
jk.
11
Serait-il pédant de souligner que "japonais" n'est pas un encodage?
Ixrec
@lxrec -> vous avez raison. Le japonais n'est pas un encodage. Ce que je voulais dire, c'était des caractères japonais, mais je n'ai pas complètement saisi. merci
KK99
@jk Dans certaines implémentations si le nom de fichier n'est pas ASCII, l'application se bloque. histoire vraie :-)
KK99

Réponses:

30

Comme je l'ai dit, l'exigence est floue pour moi.

Ma première question est la suivante: combien de codages de caractères doivent être pris en charge? Les interprétations possibles incluent:

  1. Chaque encodage jamais conçu, y compris un octet (par exemple ISO-8859-15 ), multi-octets (par exemple Big5 , Shift-JIS , HZ ) et rares / étranges (par exemple UTF-7 , Punycode , EBCDIC ).
  2. C'est évidemment extrême. Que diriez -vous du support minimum, à savoir ISO-8859-1?
  3. La norme ISO-8859-1 semble vraiment difficile. Que diriez-vous de simplement prendre en charge les meilleures pratiques modernes, à savoir Unicode en UTF-8 ?

Si vous ne spécifiez pas les encodages que vous voulez dire, alors lorsqu'un bogue spécifique à l'encodage se produit, vous et l'implémentateur pourriez vous battre et vous auriez tous les deux raison. C'est, par définition, la conséquence d'une spécification floue.

Pour aller plus loin, qu'est-ce que le logiciel doit faire avec le nom de fichier, en plus de ne pas planter? Devrait-il…

  1. Conserver le nom de fichier dans son encodage d'origine, octet par octet?
  2. Normaliser tout en Unicode? Si oui, doit-il détecter automatiquement l'encodage source? Par quel mécanisme?
  3. Stockez à la fois le formulaire Unicode et l'original, juste au cas où la normalisation échouerait?

Une meilleure version de votre exigence serait

Le téléchargeur doit prendre en charge les noms de fichiers dans divers encodages, y compris au moins ASCII, ISO-8859-1, ISO-8859-15, KOI8-R, UTF-8, Shift-JIS, EUC-JP, GB2312 et Big5. Si la réponse du serveur Web spécifie un encodage, il doit être respecté. (Si le codage n'est pas spécifié, ISO-8859-1 peut être supposé, ou une meilleure estimation peut être faite.) Les noms de fichiers doivent être normalisés en une représentation Unicode dans le système de gestion de contenu.

Les exemples spécifiques de codages requis sont essentiels pour élaborer des critères d'acceptation. Les phrases ajoutées indiquent ce que le logiciel doit faire, au-delà de ne pas planter.

200_success
la source
Alors que NTFS stocke les noms de fichiers en Unicode, la plupart des autres systèmes de fichiers stockent les noms de fichiers sous forme de flux d'octets sans codage spécifié. Dans ce cas, comment sauriez-vous même quel encodage deviner?
Gabe
@Gabe Le serveur Web, lorsqu'il sert le fichier, peut indiquer l'encodage. Sinon, il existe également des heuristiques d'analyse de texte qui peuvent deviner un encodage.
200_success
2
Rappelez-vous, nous parlons du nom de fichier lui-même, pas du contenu du fichier. Les chances sont que le serveur Web n'a aucun moyen de connaître l'encodage du nom de fichier, donc s'il prétend que le nom de fichier est dans un certain encodage, il ment probablement. Si vous essayez de convertir UTF-8 en UTF-16 mais que votre nom de fichier est vraiment ISO-8859-1, vous risquez de tomber en panne. Voir également blogs.msdn.com/b/oldnewthing/archive/2007/04/17/2158334.aspx pour un exemple de la mauvaise qualité de l'heuristique pour deviner les encodages à partir d'échantillons de texte de la taille d'un nom de fichier.
Gabe
@Gabe Notez que j'ai suggéré ISO-8859-1 par défaut. Il y a une raison à cela - cela évite beaucoup des dangers que vous mentionnez.
200_success
Je crains que UTF-8 ne suffise pas - au moins à partir de certaines versions de Windows (systèmes de fichiers FAT?), Vous obtiendrez des noms de fichiers dans les encodages locaux non unicode - par exemple win-1252 ou win-1257; le navigateur peut convertir les noms de fichiers en utf-8 lors du téléchargement, mais j'en doute.
Peteris
14

L'exigence que vous avez écrite n'a pas les caractéristiques d'une bonne exigence . Plus précisément, ce n'est pas cohérent, ce n'est pas atomique et ce n'est pas sans ambiguïté. En raison de l'absence de ces caractéristiques, ce n'est pas non plus facilement vérifiable.

Votre condition d'état initiale est:

Le nom du fichier téléchargé peut contenir des caractères non ASCII et le traitement de celui-ci ne fera pas planter l'application

Je recommanderais de supprimer le "... et le traitement de cela ne plantera pas l'application". Si vous avez besoin qu'un logiciel doive faire quelque chose, je pense que c'est OK de faire l'hypothèse qu'il devrait le faire sans planter le logiciel.

Cela transforme l'exigence en:

Le nom du fichier téléchargé peut contenir des caractères non ASCII

Maintenant, vous avez une exigence cohérente et atomique. Cependant, je ne suis pas sûr que ce soit sans ambiguïté. Dans votre question, vous mentionnez un certain nombre de formats différents. Il y a quelques options.

Certains recommanderaient une exigence distincte et unique pour chaque codage de nom de fichier qui doit être pris en charge. Cela prendrait le mieux en charge des exigences cohésives, atomiques, traçables, non ambiguës et vérifiables. Il serait également plus facile de spécifier l'importance de chaque exigence - peut-être que la prise en charge de certains encodages est plus importante ou nécessaire plus tôt.

D'autres peuvent recommander un tableau des formats pris en charge et cette exigence serait liée à un tableau. Ce serait moins complet (vous avez une phrase textuelle et un tableau à maintenir), mais ils seraient dans le même document ou la même base de données. Toutefois, si vous deviez effectuer une liaison dans un outil de gestion des exigences, elles pourraient être liées entre elles afin que les modifications apportées à l'une mettent en évidence l'exigence liée. Cela permettrait également au texte de circuler vers d'autres progiciels tels quels, mais avec un tableau différent pour différents encodages.

Cependant, la façon dont vous documentez les exigences dépend de vos besoins spécifiques.

Thomas Owens
la source
4

Il y a quelques problèmes avec votre formulation qui affaiblissent l'exigence:

1) Vous devez exprimer l'exigence en termes positifs plutôt qu'en termes de ce qu'elle ne devrait pas faire . Comment peut-on tester pour "ne pas planter".

2) L'expression "Le nom du fichier téléchargé peut contenir ..." est vague.

Une formulation alternative suggérée (purement subjective, bien sûr) pourrait être:

L'application doit prendre en charge les noms de fichiers téléchargés contenant des caractères non ASCII.

(Le mot «support» est encore un peu vague et pourrait être modifié pour être plus concret lorsqu'il est utilisé de concert avec d'autres exigences pour votre application.)

Kent A.
la source
1
Auto-commentaire: non-ASCII n'est pas non plus la meilleure formulation, car non-ASCII pourrait signifier tout autre encodage. Une meilleure exigence énumérerait les encodages autorisés, ce qui rendrait les cas de test résultants plus capables de déterminer que le logiciel fonctionne comme prévu. Sinon, le test d'un codage non ASCII pourrait satisfaire à l'exigence, mais peut ne pas tester complètement le logiciel.
Kent A.
2
Il serait préférable d'indiquer "l'application doit prendre en charge les noms de fichiers téléchargés contenant des caractères Unicode" et peut-être indiquer l'encodage spécifique qui doit être pris en charge, par exemple UTF-8.
1

Le problème avec la spécification telle qu'elle est écrite est qu'elle ne dit pas ce que l'application doit faire avec les noms de fichiers "intéressants". J'ai rencontré un programme qui remplacerait tous les caractères de nom de fichier avec lesquels il ne comprenait pas _, avec pour effet que lorsqu'on lui a demandé de copier un répertoire contenant deux caractères dont les noms étaient identiques, sauf dans les caractères que l'utilitaire ne comprenait pas, le deuxième fichier écrit dans le répertoire écraserait le premier. Un tel comportement serait qualifié de "ne pas planter", mais cela ne devrait pas impliquer qu'il est acceptable en l'absence d'une spécification explicite le disant.

Je suggérerais qu'une bonne spécification devrait spécifier de manière affirmative ce qui devrait se produire, ou bien noter quels plans d'action sont acceptables, par exemple "Si un nom de fichier contient des caractères non reconnus, le système devrait générer un nouveau GUID pour l'opération globale, et générer un nom de fichier qui combine ce GUID, un numéro d'index et toute partie du nom de fichier d'origine qui peut être facilement hébergée; il doit produire un tableau mappant les anciens et les nouveaux noms de fichiers "ou" Si un nom de fichier contient des caractères non reconnus, le système peut former un nouveau nom en concaténant les caractères qu'il reconnaît; si deux noms de fichiers finissent par devenir identiques par une telle transformation, l'un ou l'autre peut être arbitrairement déclaré "gagnant" ".

supercat
la source