Сформулювання вимоги щодо кодування імені файлів


12

Я зараз складаю специфікацію вимог, і у мене виникає дилема в тому, щоб сформулювати частину вимог.

Сценарій: ми завантажуємо файли з веб-сайту, і завантажені файли потрібно приєднати до елемента інструменту CM. Завантажені файли містять імена, які можуть бути ASCII, ISO-8859-1, японські тощо.

У фразах нижче, чи охоплює "не ASCII" всі ситуації?

Завантажене ім'я файлу може містити символи, що не належать до ASCII, і обробка цього не призведе до збою програми


З на веб - сайті, або з багатьох веб - сайтів? Чи справді один веб-сайт містить файлову систему gobbledegook?
200_успіх

7
тому, якщо ім'я файлу містить ascii, додаток може вийти з ладу;)
jk.

11
Чи було б педантичним зазначити, що "японець" - це не кодування?
Іксрек

@lxrec -> ти прав. Японська мова не є кодуванням. Що я хотів сказати, це японські символи, але не вводився повністю. спасибі
KK99

@jk У деяких реалізаціях, якщо ім'я файлу не ASCII, програма виходить з ладу. правдива історія :-)
KK99

Відповіді:


30

Вимога, як заявлено, мені нечітка.

Перше питання, яке у мене виникне: скільки кодувань символів потрібно підтримувати? Можливі тлумачення включають:

  1. Кожне кодування, коли-небудь розроблене, включаючи однобайтові (наприклад, ISO-8859-15 ), багатобайтові (наприклад, Big5 , Shift-JIS , HZ ) та рідкісні / дивні (наприклад, UTF-7 , Punycode , EBCDIC ).
  2. Це очевидно екстремально. Як щодо мінімальної підтримки, а саме ISO-8859-1?
  3. Просто ISO-8859-1 здається неприємним. Як щодо просто підтримки сучасних кращих практик, а саме Unicode як UTF-8 ?

Якщо ви не вкажете, які кодування ви маєте на увазі, тоді, коли виникла помилка, пов’язана з кодуванням, ви та реалізатор могли би боротися, і ви обидва матимете рацію. Тобто, за визначенням, наслідок нечіткої специфікації.

Далі, що програмне забезпечення має робити з іменем файлу, окрім того, що воно не дає збоїв? Повинен ...

  1. Збережіть ім'я файлу в його первісному кодуванні, байт за байтом?
  2. Нормалізувати все для Unicode? Якщо так, чи потрібно автоматично виявляти кодування джерела? За яким механізмом?
  3. Зберігайте як форму Unicode, так і оригінал, на випадок, якщо нормалізація не вдасться?

Кращою версією вашої вимоги буде

Завантажувач повинен підтримувати назви файлів у різних кодуваннях, включаючи щонайменше ASCII, ISO-8859-1, ISO-8859-15, KOI8-R, UTF-8, Shift-JIS, EUC-JP, GB2312 та Big5. Якщо у відповіді веб-сервера вказано кодування, його потрібно дотримуватися. (Якщо кодування не визначено, може бути припущено ISO-8859-1, або краще зробити здогад.) Імена файлів повинні бути нормалізовані до представлення Unicode в системі управління вмістом.

Конкретні приклади необхідних кодувань є важливими для розробки критеріїв прийняття. У доданих реченнях зазначено, що програмне забезпечення потрібно робити, крім того, щоб не збій.


Хоча NTFS зберігає назви файлів у Unicode, більшість інших файлових систем зберігають назви файлів у вигляді потоків байтів без заданого кодування. З огляду на цей випадок, як би ви навіть знали, про кодування що вгадати?
Гейб

@Gabe Веб-сервер, коли він обслуговує файл, може вказувати на кодування. Якщо ні, то є також евристика аналізу тексту, яка може здогадатися про кодування.
200_успіх

2
Пам'ятайте, ми говоримо про саме ім'я файлу, а не про вміст файла. Шанси, що веб-сервер не може знати кодування імені файлу, тому, якщо він стверджує, що ім'я файлу знаходиться в певному кодуванні, воно, ймовірно, бреше. Якщо ви спробуєте конвертувати з UTF-8 в UTF-16, але ваше ім'я справді ISO-8859-1, ви, ймовірно, отримаєте збій. Також див. Blogs.msdn.com/b/oldnewthing/archive/2007/04/17/2158334.aspx для прикладу того, наскільки погана евристика для відгадування кодувань із зразків розміру файлу розміру файлу.
Гейб

@Gabe Зауважте, що я запропонував ISO-8859-1 як стандартний. Для цього є причина - це дозволяє уникнути багатьох небезпек, про які ви згадуєте.
200_успіх

Я побоююся, що UTF-8 буде недостатньо - принаймні, з деяких версій Windows (файлових систем FAT?) Ви отримаєте назви файлів у локальних кодуваннях unicode - наприклад, win-1252 або win-1257; браузер може перетворити назви файлів у utf-8 при завантаженні, але я сумніваюся в цьому.
Петріс

14

Виписана вами вимога не має характеристик хорошої вимоги . Зокрема, це не згуртовано, це не атомно, і це не однозначно. Через відсутність цих характеристик це також не просто перевірити.

Ваша початкова вимога до стану:

Завантажене ім'я файлу може містити символи, що не належать до ASCII, і обробка цього не призведе до збою програми

Я рекомендую видалити "... і обробка цього не призведе до збоїв програми". Якщо у вас є вимога, що частина програмного забезпечення повинна щось робити, я думаю, що це нормально, щоб зробити припущення, що воно повинно це робити без збоїв програмного забезпечення.

Це перетворює вимогу в:

Ім'я завантаженого файлу може містити символи, що не належать до ASCII

Тепер у вас є згуртованість та атомна вимога. Однак я не впевнений, що це однозначно. У своєму запитанні ви згадуєте ряд різних форматів. Є кілька варіантів.

Деякі рекомендують окрему та унікальну вимогу до кожного кодування імені файлів, яке повинно підтримуватися. Це найкраще підтримувати б згуртовані, атомні, простежувані, однозначні та перевіряються вимоги. Також було б простіше вказати важливість кожної вимоги - можливо, підтримка деяких кодувань важливіша або потрібна швидше.

Інші можуть рекомендувати таблицю підтримуваних форматів, і ця вимога посилається на таблицю. Це було б менш повно (у вас є текстове речення та таблиця, які слід підтримувати), але вони будуть у тому ж документі чи базі даних. Однак, якщо ви збираєтеся здійснювати зв’язування в інструменті управління вимогами, вони можуть бути пов'язані між собою, щоб зміни в одному виділили б пов’язану вимогу. Це також дозволить тексту надходити до інших програмних пакетів, як є, але з іншою таблицею для різних кодувань.

Однак, як ви документуєте вимоги, залежить від ваших конкретних потреб.


4

Є кілька питань із вашою формулюванням, які послаблюють вимогу:

1) Ви повинні висловити вимогу позитивно , а не через те, що вона не повинна робити . Як проводиться один тест на те, щоб "не вийти з ладу".

2) Фраза "Завантажена назва файлу може містити ..." нечітка.

Запропонованою альтернативною формулюванням (звичайно, суб'єктивно, звичайно) може бути:

Додаток повинен підтримувати завантажені імена файлів, що містять символи, що не належать до ASCII.

(Слово "підтримка" все ще трохи розпливчасте і може бути змінене на конкретніше, якщо воно узгоджується з іншими вимогами до вашої заявки.)


1
Само коментар: non-ASCII також не є найкращою формулюванням, оскільки non-ASCII може означати будь-яке інше кодування. Кращою вимогою було б перерахувати дозволені кодування, що дозволило б отриманим тестовим випадкам визначити, що програмне забезпечення працює за призначенням. В іншому випадку тестування одного кодування, що не є ASCII, може задовольнити вимогу, але може не повністю перевірити програмне забезпечення.
Кент А.

2
Було б краще заявити, що "програма підтримує імена завантажених файлів, що містять символи Unicode", і, можливо, вказати конкретне кодування, яке повинно підтримуватися, наприклад, UTF-8.

1

Проблема з специфікацією, як написано, полягає в тому, що вона не говорить про те, що програма повинна робити із "цікавими" іменами. Я стикався з однією програмою, яка замінила б будь-які символи імені файлів, з якими вона не зрозуміла _, внаслідок чого, коли попросили скопіювати каталог, який містив два символи, імена яких були ідентичними, крім символів, які утиліта не зрозуміла, другий файл записане в каталог замінить би перше. Така поведінка може бути кваліфікована як "не збій", але це не повинно означати, що прийнятна відсутність явної специфікації, яка б це сказала.

Я б запропонував, що хороша специфікація повинна ствердно вказати, що має відбуватися, або ж зазначити, які курси дій є прийнятними, наприклад "Якщо ім'я файлу містить нерозпізнані символи, система повинна створити новий GUID для загальної операції та створити ім'я файлу яка поєднує цей GUID, номер індексу та будь-яку частину оригінального імені файлу, яка може бути легко розміщена; вона повинна створювати таблицю, що відображає старі та нові імена файлів "або" Якщо ім'я файлу містить нерозпізнані символи, система може сформувати новий ім'я, об'єднуючи символи, які він розпізнає; якщо два імена файлів у результаті стануть однаковими через таке перетворення, будь-яке може бути довільно оголошено "переможцем" ".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.