Phrasing một yêu cầu về mã hóa tên tệp


12

Tôi đang trong quá trình viết một yêu cầu cụ thể, và tôi có một vấn đề nan giải trong việc thực hiện một phần của các yêu cầu.

Kịch bản: Chúng tôi tải xuống các tệp từ một trang web và các tệp đã tải xuống cần được đính kèm vào một mục trong công cụ CM chúng tôi có. Các tệp đã tải xuống chứa các tên có thể là ASCII, ISO-8859-1, tiếng Nhật, v.v.

Trong các cụm từ dưới đây, "không phải ASCII" có bao gồm tất cả các tình huống không?

Tên tệp đã tải xuống có thể chứa các ký tự không phải ASCII và việc xử lý này sẽ không làm hỏng ứng dụng


Từ một trang web, hoặc từ nhiều trang web? Có phải một trang web thực sự chứa một hệ thống tập tin gobbledegook?
200_success

7
vì vậy nếu tên tệp chứa ascii, ứng dụng được phép gặp sự cố;)
jk.

11
Nó có phải là mô phạm để chỉ ra rằng "Nhật Bản" không phải là một mã hóa?
Ixrec 04/03/2015

@lxrec -> bạn đúng. Tiếng Nhật không phải là mã hóa. Điều tôi muốn nói là các ký tự tiếng Nhật nhưng không nhập hoàn toàn. cảm ơn
KK99

@jk Trong một số triển khai nếu tên tệp không phải là ASCII, ứng dụng gặp sự cố. câu chuyện có thật :-)
KK99

Câu trả lời:


30

Yêu cầu, như đã nêu, là mờ đối với tôi.

Câu hỏi đầu tiên tôi sẽ có là: cần bao nhiêu mã hóa ký tự? Giải thích có thể bao gồm:

  1. Mọi mã hóa từng được phát minh, bao gồm byte đơn (ví dụ ISO-8859-15 ), đa nhân (ví dụ Big5 , Shift-JIS , HZ ) và hiếm / lạ (ví dụ UTF-7 , Punycode , EBCDIC ).
  2. Đó rõ ràng là cực đoan. Làm thế nào về chỉ hỗ trợ tối thiểu, cụ thể là ISO-8859-1?
  3. Chỉ cần ISO-8859-1 có vẻ đáng sợ. Làm thế nào về việc chỉ hỗ trợ các thực tiễn tốt nhất hiện đại, cụ thể là Unicode như UTF-8 ?

Nếu bạn không chỉ định mã hóa của bạn, thì khi xảy ra lỗi cụ thể về mã hóa, bạn và người triển khai có thể có một cuộc chiến và cả hai bạn đều đúng. Đó là, theo định nghĩa, hậu quả của một thông số mờ.

Đi xa hơn, phần mềm cần làm gì với tên tệp, ngoài việc không bị sập? Nó có nên

  1. Giữ nguyên tên tệp trong mã hóa ban đầu của nó, byte cho byte?
  2. Bình thường hóa mọi thứ thành Unicode? Nếu vậy, nó có cần tự động phát hiện mã hóa nguồn không? Theo cơ chế nào?
  3. Lưu trữ cả dạng Unicode và bản gốc, chỉ trong trường hợp chuẩn hóa thất bại?

Một phiên bản tốt hơn của yêu cầu của bạn sẽ là

Trình tải xuống phải hỗ trợ tên tệp theo các bảng mã khác nhau, bao gồm ít nhất ASCII, ISO-8859-1, ISO-8859-15, KOI8-R, UTF-8, Shift-JIS, EUC-JP, GB2312 và Big5. Nếu phản hồi của máy chủ web chỉ định mã hóa, nó phải được tôn trọng. (Nếu mã hóa không được chỉ định, ISO-8859-1 có thể được giả sử hoặc có thể dự đoán tốt hơn.) Tên tệp sẽ được chuẩn hóa thành biểu diễn Unicode trong hệ thống quản lý nội dung.

Các ví dụ cụ thể về mã hóa cần thiết là rất cần thiết để đưa ra các tiêu chí chấp nhận. Các câu được thêm vào nói lên những gì phần mềm cần làm, ngoài việc không bị lỗi.


Trong khi NTFS lưu trữ tên tệp bằng Unicode, hầu hết các hệ thống tệp khác lưu trữ tên tệp dưới dạng luồng byte mà không có bất kỳ mã hóa được chỉ định nào. Với trường hợp đó, làm thế nào bạn thậm chí sẽ biết mã hóa để đoán?
Gabe

@Gabe Máy chủ web, khi phục vụ tệp, có thể cho biết mã hóa. Nếu không, cũng có các heuristic phân tích văn bản có thể đoán mã hóa.
200_success

2
Hãy nhớ rằng, chúng ta đang nói về chính tên tệp chứ không phải nội dung của tệp. Điều lạ lùng là máy chủ web không có cách nào biết được mã hóa của tên tệp, vì vậy nếu nó tuyên bố rằng tên tệp nằm trong một mã hóa nhất định, thì có lẽ nó đang nói dối. Nếu bạn cố gắng chuyển đổi từ UTF-8 sang UTF-16 nhưng tên tệp của bạn thực sự là ISO-8859-1, bạn có khả năng gặp sự cố. Ngoài ra, hãy xem blog.msdn.com/b/oldnewthing/archive/2007/04/17/2158334.aspx để biết ví dụ về cách heuristic xấu khi đoán mã hóa từ các mẫu văn bản có kích thước tên tệp.
Gabe

@Gabe Lưu ý rằng tôi đã đề xuất ISO-8859-1 làm mặc định. Có một lý do cho điều đó - nó tránh được rất nhiều nguy hiểm mà bạn đề cập.
200_success

Tôi sợ rằng UTF-8 sẽ không đủ - ít nhất là từ một số phiên bản của windows (hệ thống tập tin FAT?) Bạn sẽ nhận được tên tệp trong các mã hóa cục bộ không mã hóa - ví dụ: win-1252 hoặc win-1257; trình duyệt có thể chuyển đổi tên tệp thành utf-8 khi tải lên nhưng tôi nghi ngờ điều đó.
Peteris

14

Yêu cầu mà bạn đã viết không có các đặc điểm của một yêu cầu tốt . Cụ thể, nó không gắn kết, nó không nguyên tử, và nó không mơ hồ. Do thiếu các đặc điểm này, nó cũng không dễ kiểm chứng.

Yêu cầu trạng thái ban đầu của bạn là:

Tên tệp đã tải xuống có thể chứa các ký tự không phải ASCII và việc xử lý này sẽ không làm hỏng ứng dụng

Tôi khuyên bạn nên xóa "... và xử lý việc này sẽ không làm hỏng ứng dụng". Nếu bạn có một yêu cầu rằng một phần mềm cần phải làm một cái gì đó, tôi nghĩ sẽ ổn khi đưa ra giả định rằng nó nên làm điều đó mà không làm hỏng phần mềm.

Điều này biến đổi yêu cầu thành:

Tên tệp đã tải xuống có thể chứa các ký tự không phải ASCII

Bây giờ, bạn có một yêu cầu gắn kết và nguyên tử. Tuy nhiên, tôi không chắc rằng nó không rõ ràng. Trong câu hỏi của bạn, bạn đề cập đến một số định dạng khác nhau. Có một vài lựa chọn.

Một số sẽ đề xuất một yêu cầu riêng biệt và duy nhất cho mỗi mã hóa tên tệp phải được hỗ trợ. Điều này sẽ hỗ trợ tốt nhất cho các yêu cầu gắn kết, nguyên tử, có thể truy nguyên, không mơ hồ và có thể kiểm chứng. Nó cũng sẽ giúp dễ dàng hơn để xác định tầm quan trọng của từng yêu cầu - có lẽ hỗ trợ cho một số mã hóa là quan trọng hơn hoặc cần thiết sớm hơn.

Những người khác có thể đề xuất một bảng các định dạng được hỗ trợ và yêu cầu này sẽ liên kết với một bảng. Nó sẽ ít hoàn thiện hơn (bạn có một câu văn bản và một bảng được duy trì), nhưng chúng sẽ nằm trong cùng một tài liệu hoặc cơ sở dữ liệu. Tuy nhiên, nếu bạn định thực hiện liên kết trong một công cụ quản lý yêu cầu, chúng có thể được liên kết với nhau để những thay đổi thành một sẽ làm nổi bật yêu cầu được liên kết. Nó cũng sẽ cho phép văn bản chảy sang các gói phần mềm khác, nhưng với một bảng khác cho các bảng mã khác nhau.

Làm thế nào bạn ghi lại các yêu cầu phụ thuộc vào nhu cầu cụ thể của bạn, mặc dù.


4

Có một số vấn đề với từ ngữ của bạn làm suy yếu yêu cầu:

1) Bạn nên thể hiện yêu cầu theo cách tích cực , hơn là về những điều không nên làm . Làm thế nào để kiểm tra "không bị rơi".

2) Cụm từ "Tên tệp đã tải xuống có thể chứa ..." là mơ hồ.

Một từ ngữ thay thế được đề xuất (hoàn toàn chủ quan, tất nhiên) có thể là:

Ứng dụng sẽ hỗ trợ các tên tệp được tải xuống có chứa các ký tự không phải ASCII.

(Từ "hỗ trợ" vẫn còn hơi mơ hồ và có thể được thay đổi để cụ thể hơn khi được thực hiện cùng với các yêu cầu khác cho ứng dụng của bạn.)


1
Tự nhận xét: không phải ASCII cũng không phải là từ ngữ tốt nhất, vì không phải ASCII có thể có nghĩa là bất kỳ mã hóa nào khác. Một yêu cầu tốt hơn sẽ liệt kê các mã hóa được phép, điều này sẽ làm cho các trường hợp thử nghiệm kết quả có thể xác định được rằng phần mềm hoạt động như dự định. Mặt khác, kiểm tra một mã hóa không phải ASCII có thể đáp ứng yêu cầu, nhưng có thể không kiểm tra đầy đủ phần mềm.
Kent A.

2
Sẽ tốt hơn nếu nói rằng "ứng dụng sẽ hỗ trợ các tên tệp được tải xuống có chứa các ký tự Unicode" và có lẽ nói rõ mã hóa cụ thể phải được hỗ trợ, ví dụ UTF-8.

1

Vấn đề với thông số kỹ thuật như được viết là nó không cho biết ứng dụng nên làm gì với tên tệp "thú vị". Tôi đã gặp một chương trình thay thế bất kỳ ký tự tên tệp nào mà nó không hiểu _, với hiệu ứng khi được yêu cầu sao chép một thư mục chứa hai ký tự có tên giống nhau ngoại trừ trong các ký tự mà tiện ích không hiểu, tệp thứ hai được ghi vào thư mục sẽ ghi đè lên đầu tiên. Hành vi như vậy sẽ đủ điều kiện là "không sụp đổ", nhưng điều đó không có nghĩa là không thể chấp nhận được mà không có thông số rõ ràng nói như vậy.

Tôi sẽ đề nghị một thông số kỹ thuật tốt nên xác định rõ ràng những gì sẽ xảy ra hoặc nếu không lưu ý các khóa học hành động nào được chấp nhận, ví dụ: "Nếu tên tệp chứa các ký tự không được nhận dạng, hệ thống sẽ tạo GUID mới cho hoạt động chung và tạo tên tệp kết hợp GUID đó, một số chỉ mục và bất kỳ phần nào của tên tệp gốc có thể được cung cấp, nó sẽ tạo ra một bảng ánh xạ tên tệp cũ và mới "hoặc" Nếu tên tệp chứa các ký tự không được nhận dạng, hệ thống có thể tạo thành một tên mới đặt tên bằng cách ghép các ký tự mà nó nhận ra, nếu hai tên tệp cuối cùng trở nên giống hệt nhau thông qua phép chuyển đổi đó, một trong hai có thể tùy ý tuyên bố là 'người chiến thắng' ".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.