Chữ số kiểm tra ISBN ISSN là phần cuối của hai loại mã dùng trong ngành xuất bản: một loại dành cho sách và một loại dành cho ấn phẩm định kỳ như tạp chí. Cả hai loại mã đều có chữ số kiểm tra, nhưng chúng dùng hai thuật toán khác nhau, và bản thân mã sách còn tồn tại song song ở hai hệ thống có độ dài khác nhau. Đọc hết bài này, bạn sẽ biết vì sao có trường hợp chữ số kiểm tra không phải chữ số mà là chữ X, vì sao dấu gạch nối không được tính vào phép kiểm tra, và vì sao một mã đạt kiểm tra vẫn chưa nói được gì về việc ấn phẩm đó có tồn tại.
ISBN và ISSN khác nhau ở chỗ nào?
Điểm khác nhau đầu tiên nằm ở đối tượng được định danh. Một loại mã gắn với một ấn phẩm cụ thể, ví dụ một cuốn sách hoặc một phiên bản của cuốn sách đó. Loại còn lại gắn với chính bản thân ấn phẩm định kỳ, tức là tựa tạp chí nói chung, chứ không gắn với từng số phát hành riêng lẻ.
Điểm khác nhau thứ hai nằm ở thuật toán. Mã sách dùng một nhánh thuật toán có trọng số tăng dần đều, còn mã ấn phẩm định kỳ dùng một nhánh có trọng số xen kẽ. Vì vậy hai loại mã không thể dùng chung một hàm tính chữ số kiểm tra, và việc áp nhầm hàm sẽ cho ra kết quả không đạt cho gần như mọi giá trị đúng.
Điểm chung là cả hai đều có thể được in kèm dấu gạch nối để chia thành nhóm cho dễ đọc. Dấu gạch nối chỉ phục vụ việc trình bày; nó không mang thông tin và không tham gia vào phép tính. Vì vậy bước chuẩn hóa phải bỏ hết dấu gạch nối trước khi đếm độ dài.
Hai hệ thống ISBN và sự chuyển đổi giữa chúng
Mã sách tồn tại ở hai hệ thống có độ dài khác nhau: một hệ thống ngắn hơn được dùng trong giai đoạn trước, và một hệ thống dài hơn được dùng phổ biến hiện nay. Hai hệ thống không thay thế hoàn toàn nhau về mặt dữ liệu, vì rất nhiều tài liệu cũ vẫn mang mã theo hệ thống ngắn, và các thư viện vẫn phải xử lý cả hai.
| Đặc điểm | Hệ thống ngắn | Hệ thống dài |
|---|---|---|
| Độ dài chuỗi | Ngắn hơn | Dài hơn |
| Kiểu trọng số | Tăng dần đều | Tăng dần đều |
| Chữ số kiểm tra có thể là chữ cái | Có | Không |
| Dấu gạch nối khi in | Có, vị trí thay đổi | Có, vị trí thay đổi |
| Dùng chung thuật toán với nhau | Không trực tiếp | Không trực tiếp |
Việc chuyển đổi giữa hai hệ thống là một phép biến đổi có quy tắc riêng, không phải chỉ là thêm một đoạn cố định vào đầu chuỗi. Trong nhiều trường hợp, một mã ở hệ thống ngắn có thể được chuyển sang hệ thống dài, nhưng không phải mọi mã đều chuyển được, và mã sau khi chuyển phải được tính lại chữ số kiểm tra theo đúng thuật toán của hệ thống đích.
Trong thực tế, đây là nguồn gốc của nhiều lỗi dữ liệu thư viện: một bản ghi bị chuyển đổi nửa vời, phần thân đã đổi nhưng chữ số kiểm tra vẫn giữ của hệ thống cũ. Phép kiểm tra sẽ báo không đạt ngay, và người dùng sẽ tưởng mã in trên sách bị sai, trong khi lỗi nằm ở bước xử lý dữ liệu.
Vì sao có trường hợp chữ số kiểm tra là chữ X?
Ở một trong hai hệ thống mã sách, thuật toán dùng phép lấy dư cho mười một, và phần dư có thể rơi vào giá trị mười. Vì mười không phải một chữ số, người ta quy ước biểu diễn nó bằng chữ X. Đây là một quy ước hoàn toàn kỹ thuật, không mang ý nghĩa gì khác.
Hệ quả là mọi bộ kiểm tra cho loại mã này phải chấp nhận một ký tự không phải chữ số ở vị trí cuối cùng. Nếu bạn kiểm tra tập ký tự bằng cách chỉ cho phép chữ số cho toàn bộ chuỗi, bạn sẽ từ chối oan những mã hợp lệ có chữ X ở cuối. Đây là lỗi rất phổ biến trong các bản triển khai tự viết.
Cách xử lý đúng là tách hai vùng ký tự: phần thân chỉ chấp nhận chữ số, còn vị trí cuối cùng chấp nhận chữ số hoặc chữ X. Việc so khớp chữ X nên được thực hiện sau khi đã thống nhất dạng chữ, để cả chữ x viết thường và chữ X viết hoa đều được chấp nhận. Bạn cũng nên ghi nhớ rằng chữ X chỉ có nghĩa ở một hệ thống; ở hệ thống còn lại, nó là một ký tự không hợp lệ.
Dấu gạch nối không mang thông tin kiểm tra
Dấu gạch nối trong mã sách và mã ấn phẩm định kỳ được đặt theo các nhóm có ý nghĩa hành chính: nhóm chỉ quốc gia hoặc nhóm ngôn ngữ, nhóm chỉ nhà xuất bản, nhóm chỉ ấn phẩm. Nhưng vị trí của các dấu gạch nối không cố định, vì độ dài của từng nhóm thay đổi tùy theo nhà xuất bản đăng ký.
Chính vì vậy không thể dùng vị trí dấu gạch nối để suy ra ranh giới các nhóm, và cũng không thể dùng nó để kiểm tra tính đúng đắn. Một chuỗi có dấu gạch nối đặt sai vị trí vẫn có thể đúng về mặt chữ số kiểm tra. Ngược lại, một chuỗi không có dấu gạch nối nào vẫn có thể là một mã hoàn toàn hợp lệ.
Cách xử lý thực tế gồm ba bước. Bỏ hết dấu gạch nối và mọi ký tự ngăn cách để thu được chuỗi chỉ gồm chữ số và có thể có chữ X ở cuối. Đếm độ dài để xác định đang xử lý hệ thống nào. Rồi mới chạy phép tính chữ số kiểm tra tương ứng. Nếu bạn giữ dấu gạch nối trong bước đếm, mọi kết luận sau đó đều sai.
Một ấn phẩm đạt kiểm tra có nghĩa nó tồn tại?
Không. Phép kiểm tra chỉ nói rằng chuỗi ký tự nhất quán với chính nó theo thuật toán đã công bố. Nó không tra cứu bất kỳ cơ sở dữ liệu thư mục nào, không biết mã đó được gán cho tựa sách nào, và không biết ấn phẩm đó còn được lưu hành hay đã ngừng. Một người hiểu quy tắc có thể dựng một mã mới hoàn toàn, tính ra chữ số kiểm tra cho nó, và mã đó sẽ đạt phép kiểm tra mà chưa từng được cấp cho ấn phẩm nào.
Sự khác biệt này quan trọng trong các hệ thống thư viện và bán sách, vì hai loại lỗi khác nhau cần hai cách xử lý khác nhau. Lỗi chữ số kiểm tra là lỗi nhập liệu, sửa được ngay. Còn việc một mã không có trong danh mục là một kết quả hợp lệ của phép tra cứu, và nó không có nghĩa mã đó sai về cấu trúc.
Nếu bạn muốn thấy hai tầng này được tách riêng trong giao diện, công cụ kiểm tra số của trang này hiển thị kết quả tính chữ số kiểm tra và kết quả nhận diện hệ thống như hai phần độc lập.
Phần dành cho nhà phát triển: một quy tắc, nhiều cách viết
Với loại dữ liệu này, phần khó không nằm ở thuật toán mà nằm ở việc xử lý nhiều cách viết của cùng một mã. Hãy chuẩn bị cho tình huống dữ liệu đầu vào không đồng nhất, vì nó là tình huống mặc định chứ không phải ngoại lệ.
- Chuẩn hóa trước, tính sau. Bỏ dấu gạch nối, dấu cách và mọi ký tự ngăn cách, thống nhất dạng chữ, rồi mới xét độ dài.
- Cho phép chữ X ở đúng một vị trí và chỉ ở hệ thống có dùng quy ước đó. Đừng cho phép chữ cái ở phần thân, và đừng chấp nhận chữ X ở hệ thống còn lại.
- Suy ra hệ thống từ độ dài chuỗi đã chuẩn hóa, không suy ra từ vị trí dấu gạch nối. Đây là hai nguồn thông tin khác nhau, và nguồn thứ hai không đáng tin.
- Khi chuyển đổi giữa hai hệ thống, luôn tính lại chữ số kiểm tra. Nếu bước này bị bỏ qua, bạn sẽ tạo ra những bản ghi đúng độ dài nhưng sai chữ số kiểm tra.
- Trả về trạng thái chỉ định dạng cho những chuỗi có độ dài không khớp bất kỳ hệ thống nào. Đừng gộp chúng vào trạng thái không hợp lệ, vì người dùng cần biết mình đã nhập thiếu hay thừa ký tự.
- Viết bộ dữ liệu thử có cả hai hệ thống, có mã kết thúc bằng chữ X, có mã in kèm dấu gạch nối ở nhiều vị trí khác nhau, và có mã sai một chữ số. Bốn nhóm này phủ hầu hết các lỗi triển khai.
Một chi tiết nhỏ nhưng hay bị bỏ sót: nếu bạn lưu mã vào cơ sở dữ liệu ở dạng đã bỏ dấu gạch nối, hãy ghi lại dạng hiển thị riêng. Người dùng cần thấy mã đúng như trên bìa sách, không phải một chuỗi số liền mạch.
Việc nên làm sau bài này
Hãy thử lấy hai mã thử ở hai hệ thống, chuyển một mã từ hệ thống ngắn sang hệ thống dài mà không tính lại chữ số kiểm tra, rồi xem hệ thống của bạn phản ứng thế nào. Đây là phép thử nhanh nhất để biết đường ống xử lý của bạn có thật sự tách hai hệ thống hay không. Để so sánh nhánh thuật toán có trọng số tăng dần với các nhánh khác, bài thuật toán chữ số kiểm tra: mod-10, mod-11 và mod-97 đặt chúng cạnh nhau; còn bài chữ số kiểm tra EAN UPC trong mã vạch cho thấy cùng một ý tưởng trọng số xen kẽ được dùng cho mã hàng hóa. Nếu công việc của bạn chạm tới dữ liệu liên hệ quốc tế, bài kiểm thử địa chỉ và số điện thoại quốc tế có thêm ví dụ cùng kiểu.
Mọi mã nhắc tới trong bài chỉ là ví dụ được dựng riêng cho việc giải thích cấu trúc kiểm tra; chúng không phải mã của bất kỳ cuốn sách, tạp chí hay ấn phẩm nào có thật, không thuộc bất kỳ nhà xuất bản nào, và không được dùng để mạo danh hay để khẳng định một ấn phẩm là có thật.