Tiếng Việt

Văn bản & công cụ hàng ngày · Bộ công cụ văn bản

Cách trình tạo slug gấp dấu: NFD giải thích về phân tách

· Cách thức hoạt động

url-slugs text-conversion javascript

Các chữ cái có dấu tách thành các chữ cái cơ bản và dấu trước khi trở thành một con sên URL
Hình minh họa vector ToolAcre gốc

Giải thích cách phân tách chuẩn Unicode tách một chữ cái cơ sở khỏi dấu của nó để 'Café Crème' trở thành cafe-creme thay vì caf-cr-me và chỉ riêng việc phân tách là không đủ.

caf-cr-me — một loại lỗi sên phổ biến được đặt tên sai và lý do nó xảy ra

Quy trình sên yếu có thể biến `Café Crème` thành `caf-cr-me` khi nó xóa mọi ký tự bên ngoài phạm vi ASCII hẹp. Các dấu có thể nhìn thấy biến mất nhưng các chữ cái cơ bản bên dưới cũng biến mất theo, để lại URL không còn giống với tiêu đề bài viết. Thiệt hại đó đặc biệt rõ ràng ở tên tuổi, địa điểm và thể loại biên tập lặp đi lặp lại.

ToolAcre đi một con đường khác trong `slugify`. Đầu tiên, nó bình thường hóa dữ liệu đầu vào, sau đó loại bỏ một phạm vi dấu kết hợp cụ thể trong khi vẫn giữ lại các chữ cái thu được. Chỉ sau đó nó mới viết thường các dấu phân cách văn bản và hình dạng. Thứ tự là lý do khiến `Café Crème` trở thành `cafe-creme` thay vì một đoạn bị thiếu nguyên âm.

Một ký tự, hai cách biểu diễn - làm thế nào é có thể là một điểm mã đơn hoặc một chữ e theo sau là một dấu trọng âm kết hợp

Văn bản trông giống hệt nhau có thể có các trình tự bên trong khác nhau. `é` có thể xuất hiện dưới dạng một ký tự được soạn trước hoặc dưới dạng `e` thông thường, theo sau là dấu cấp tính kết hợp. Người chỉnh sửa nội dung thường không thể biết cách trình bày nào đến từ CMS, tài liệu hoặc bảng nhớ tạm, tuy nhiên bộ lọc theo từng ký tự có thể xử lý hai dữ liệu đầu vào khác nhau.

Sự khác biệt tiềm ẩn đó quan trọng khi quy tắc thay thế nhận ra một dạng này chứ không phải dạng kia. ToolAcre tránh viết một bản thay thế riêng cho mỗi cách viết được soạn sẵn. Quá trình chuẩn hóa mang lại cho quy trình slug một dạng trung gian nhất quán hơn, do đó, các dấu trọng âm được hỗ trợ có thể được xóa bằng một bước sau đó trong khi các chữ cái cơ sở vẫn có sẵn cho URL.

Mẫu chuẩn hóa D - cách phân rã chuẩn viết lại mọi chữ cái có dấu thành chữ cái cơ bản cộng với dấu kết hợp

Quá trình triển khai gọi `.normalize("NFD")` trước khi bất kỳ ký tự viết thường hoặc dấu phân cách nào hoạt động. Đối với các ký tự có quá trình phân tách chuẩn được xử lý bởi thời gian chạy JavaScript, điều này sẽ tạo ra một ký tự cơ sở, theo sau là một hoặc nhiều dấu kết hợp. Hàm này không duy trì danh mục riêng về cách viết tiếng Pháp hoặc tiếng Tây Ban Nha và không kiểm tra các từ về mặt ngữ nghĩa.

Bố cục cho biết NFD viết lại mọi chữ cái có dấu nhưng nguồn hỗ trợ tuyên bố hẹp hơn. Sự phân tách phụ thuộc vào ký tự và biểu thức loại bỏ sau đây bao gồm các điểm mã từ `U+0300` đến `U+036F`. Do đó, bài viết nên mô tả hành vi được thể hiện bằng mã thay vì hứa hẹn loại bỏ dấu trọng âm chung cho mọi tập lệnh hoặc nhãn hiệu.

NFD phân tách các ký tự được hỗ trợ; việc triển khai không hứa hẹn rằng mỗi chữ cái có dấu sẽ tách biệt

Sau khi chuẩn hóa, `slugify` áp dụng `/[̀-ͯ]/g` và thay thế mỗi dấu khớp bằng một chuỗi trống. Ở dạng phân tách của `é`, `e` không khớp với phạm vi đó, trong khi dấu cấp tính thì có. Chỉ xóa dấu sẽ để lại chữ cái cơ bản có thể đọc được mà cách tiếp cận chỉ ASCII trước đó sẽ bị loại bỏ.

Đây là cách gấp có dấu, không phải là một bước dọn dẹp văn bản chung. Biểu thức chính quy được cố tình đặt trước quy tắc phân cách, cho phép chữ cái cơ sở tham gia như một chữ cái sau này. Nếu việc xóa dấu xảy ra sau khi các lần chạy không được hỗ trợ đã được thu gọn, thì dấu bị phân hủy có thể ảnh hưởng đến vị trí dải phân cách và tạo ra phần mở rộng kém chính xác hơn.

Phần còn lại của quy trình slug - viết thường, thu gọn các chữ cái không phải chữ và số thành dấu gạch nối đơn, cắt bớt dấu phân cách đầu và cuối, bỏ biểu tượng cảm xúc

Đường dẫn còn lại viết thường văn bản đã chuẩn hóa và thay thế mỗi lần chạy không phải là chữ cái hoặc số Unicode bằng dấu phân cách được định cấu hình, mặc định là dấu gạch nối. Biểu thức thứ hai cắt bớt các dấu phân cách lặp lại ở cả hai đầu. Do đó, biểu tượng cảm xúc và dấu câu sẽ biến mất dưới dạng nội dung, trong khi các ký tự không được hỗ trợ liền kề sẽ trở thành một ranh giới thay vì nhiều dấu gạch nối.

Phác thảo mô tả sự thu gọn không phải chữ và số, nhưng mẫu thực tế sử dụng các ký tự thoát thuộc tính Unicode, không phải bảng chữ cái chỉ có ASCII. Các chữ cái từ các chữ viết không phải tiếng Latinh có thể vẫn còn trong phần mở rộng sau khi viết thường. Cấu hình xác nhận không có bước chuyển ngữ: các ký hiệu bị xóa nhưng các chữ cái được giữ lại không tự động được viết lại dưới dạng cách viết gần đúng bằng tiếng Latinh.

Phần còn lại của đường dẫn slug này giữ các chữ cái và chữ số từ bất kỳ tập lệnh nào trong khi thay thế các lần chạy khác bằng dấu phân cách đã chọn

Theo dõi `Café Crème & Co. — Été 2024!` trong suốt quá trình triển khai. NFD tách các ký tự có dấu được hỗ trợ thành các chữ cái cơ bản và dấu. Biểu thức xóa dấu để lại `Cafe Creme & Co. — Ete 2024!` và viết thường tạo ra `cafe creme & co. — ete 2024!` trước khi dấu câu được xử lý.

Sau đó, các chuỗi không phải chữ cái và số không trở thành dấu gạch nối, tạo ra chuỗi có ý nghĩa `cafe-creme-co-ete-2024` sau khi dấu phân cách đầu và cuối được cắt bớt. Dấu và, dấu chấm, dấu gạch ngang và dấu chấm than không nhận được tên nói hoặc sự thay thế tùy chỉnh. Chúng chỉ đóng vai trò là ranh giới giữa các lần chạy chữ và số trong chuyển đổi này.

Việc phân tách không thể thực hiện được - các chữ cái như ø, ł, ß và æ không có dấu để tách và cần có bảng phiên âm

Sự phân hủy không phải là phiên âm. Các ký tự như `ø`, `ł`, `ß` và `æ` vẫn là các chữ cái Unicode sau quy trình này, do đó bộ lọc dựa trên thuộc tính sẽ giữ chúng thay vì tham khảo bảng cho `o`, `l`, `ss` hoặc `ae`. Tuyên bố rằng người dùng cần một bảng chuyển ngữ có thể là lời khuyên thiết kế hữu ích ở những nơi khác, nhưng không có bảng nào như vậy tồn tại trong công cụ này.

Sự khác biệt đó cũng giải thích tại sao kết quả có thể là một dự án hợp lệ mà không chỉ có ASCII. Những biên tập viên có hệ thống xuất bản yêu cầu ASCII nên kiểm tra ràng buộc hệ thống riêng biệt đó trước khi sử dụng đầu ra. ToolAcre hứa hẹn tính năng gấp dấu cho phạm vi phân tách và đánh dấu đã triển khai; nó không hứa hẹn khả năng đánh vần nhận biết ngôn ngữ, chuyển đổi có thể đảo ngược hoặc xuất ra tiếng Latinh cho mọi tiêu đề.

Các ký tự không có dấu xóa vẫn là chữ cái; công cụ này không có bảng phiên âm

Bài học đáng tin cậy mang tính thủ tục: chuẩn hóa trước, loại bỏ các dấu kết hợp được hỗ trợ, chữ thường, thu gọn các hoạt động không được hỗ trợ và cắt bớt các dấu phân cách. Mỗi giai đoạn có một trách nhiệm rõ ràng và trình tự của chúng giữ nguyên các chữ cái cơ bản trước khi dấu chấm câu bị loại bỏ. Điều đó đủ để ngăn chặn lỗi `caf-cr-me` thường gặp mà không phát minh ra các quy tắc ngôn ngữ mà nguồn không chứa.

Dán tiêu đề đã làm việc vào trình chuyển đổi kiểu chữ Văn bản và chọn tùy chọn slug để kiểm tra kết quả cuối cùng trong cùng một hộp văn bản. Nếu tiêu đề bao gồm các chữ cái nằm ngoài cách viết trọng âm đã được chứng minh, hãy xem lại kết quả đầu ra dựa trên nền tảng đích. Trình chuyển đổi cung cấp một phép chuyển đổi phía trình duyệt có thể dự đoán được, trong khi trình soạn thảo vẫn chịu trách nhiệm về các quy ước về tuyến đường.