Trình loại bỏ khoảng trắng thừa và ký tự đặc biệt là gì?
Trình loại bỏ khoảng trắng thừa và ký tự đặc biệt là công cụ xử lý văn bản thuần theo những bộ lọc do người dùng chọn. Công cụ nhận nội dung được nhập hoặc dán vào, thực hiện các phép loại bỏ hoặc thu gọn ký tự, rồi trả lại văn bản đã biến đổi. Đây không phải trình chỉnh sửa tài liệu Word hay bảng tính Excel.
Công cụ phục vụ hai nhóm nhu cầu. Nhóm thứ nhất là làm gọn khoảng trắng: thu gọn dấu cách liên tiếp, bỏ khoảng trắng đầu cuối dòng và loại bỏ dòng trống. Nhóm thứ hai là loại bỏ một số thành phần nội dung: chữ số, ký tự ngoài nhóm được giữ hoặc một tập hợp dấu câu cụ thể. Các lựa chọn này có thể bật, tắt riêng, nhưng được thực hiện theo thứ tự cố định.
Kết quả gồm văn bản đầu ra và bộ đếm độ dài. “Làm sạch” không đồng nghĩa với sửa đúng nội dung: một câu ít ký tự hơn vẫn có thể mất dấu, mất số hoặc thay đổi ý nghĩa. Công cụ không xác nhận tính chính xác của đoạn văn sau xử lý.
Bài viết giải thích hành vi được xác nhận từ mã nguồn và kiến thức nền cần thiết để chọn bộ lọc. Những vấn đề như hiệu năng thực tế, khả năng tương thích trình duyệt hay chính sách lưu dữ liệu của toàn website chưa thể được kết luận chỉ từ công cụ.

Những thuật ngữ cần hiểu khi làm sạch văn bản
Khoảng trắng
Khoảng trắng là nhóm ký tự tạo khoảng cách trong văn bản, gồm dấu cách thông thường, tab và những dạng khác như khoảng trắng không ngắt dòng. Chúng có thể nhìn giống nhau nhưng không có cùng mã ký tự. Trong công cụ này, bước gom khoảng trắng đổi tab và các khoảng trắng Unicode thường gặp (như khoảng trắng không ngắt dòng) thành dấu cách thông thường rồi mới gom, nên những khoảng trống đó vẫn được xử lý. Vì vậy, một khoảng trống còn lại thường do ký tự khoảng trắng khác nằm ngoài phạm vi đổi này, hoặc do lựa chọn gom đang tắt.
Tab
Tab là ký tự thường dùng để thụt đầu dòng hoặc phân cách cột, khác với việc gõ nhiều dấu cách. Độ rộng hiển thị của tab phụ thuộc ứng dụng nên không thể đoán cấu trúc chỉ bằng mắt. Công cụ có thể xóa tab ở đầu cuối dòng hoặc gom chuỗi khoảng trắng chứa tab. Bản mới đổi một tab đơn nằm giữa hai phần nội dung thành một dấu cách. Với dữ liệu phân cột, thay đổi tab có thể làm mất ranh giới giữa các trường.
Dòng trống
Dòng trống là dòng không có nội dung hoặc chỉ chứa khoảng trắng. Trong văn bản thuần, nó thường được tạo bằng các dấu xuống dòng liên tiếp và có thể dùng để tách đoạn. Điều này khác với khoảng cách đoạn, giãn dòng hay khoảng trống cuối trang trong Word. Công cụ xử lý ký tự xuống dòng và khoảng trắng trong nội dung, chứ không đọc thuộc tính bố cục của tài liệu. Xóa dòng trống vì thế có thể làm sát các đoạn nhưng không sửa được mọi khoảng trống nhìn thấy trên trang.
Unicode và dấu kết hợp
Unicode là hệ thống biểu diễn chữ và ký hiệu bằng mã ký tự. Một chữ tiếng Việt có dấu có thể tồn tại dưới dạng chữ mã hóa sẵn, như “á”, hoặc chữ “a” đi kèm một dấu sắc kết hợp. Hai dạng nhìn tương tự nhưng thuộc các nhóm ký tự khác nhau. Bộ lọc đặc biệt giữ chữ cái Unicode, còn bản mới chuẩn hóa NFC trước khi lọc và giữ cả dấu kết hợp (nhóm \p{M}), nên chữ dạng tách vẫn giữ dấu sau khi lọc.
Đơn vị mã UTF-16
Đơn vị mã UTF-16 là đơn vị mà phép đo độ dài chuỗi JavaScript sử dụng trong công cụ. Nhiều chữ thông thường chiếm một đơn vị, nhưng một emoji hoặc một chữ có nhiều thành phần có thể chiếm nhiều đơn vị. Vì vậy, nhãn “Ký tự” trên giao diện không nhất thiết tương ứng với số hình chữ người đọc nhìn thấy. Bộ đếm cũng không phải số từ hay số byte; nên dùng nó để đối chiếu độ dài theo cùng một cách đo.

Đầu vào, tùy chọn và cách đọc kết quả
Văn bản và các lựa chọn xử lý
Đầu vào là một chuỗi văn bản trong ô nhập, không phải tệp tài liệu. Có sáu lựa chọn xử lý. Ba lựa chọn bật sẵn là gom khoảng trắng thừa, bỏ khoảng trắng đầu cuối từng dòng và xóa dòng trống. Ba lựa chọn mặc định tắt là lọc ký tự đặc biệt, xóa dấu câu cơ bản và xóa số. Người dùng nên chọn theo thành phần thực sự muốn bỏ, thay vì bật toàn bộ để tìm một kết quả “sạch hơn”.
Chuỗi hoàn toàn rỗng cho kết quả rỗng ngay, vì bản mới tính trực tiếp khi gõ; nút Sao chép và Tải .txt bị vô hiệu khi chưa có kết quả. Chuỗi chỉ chứa dấu cách vẫn được xử lý và có thể trở thành kết quả rỗng. Thay văn bản đầu vào hoặc đổi lựa chọn sẽ tính lại đầu ra ngay, vì bản mới tính trực tiếp khi gõ hoặc đổi tùy chọn. Chức năng xóa trắng xóa ngay cả hai ô và đặt lại bộ đếm mà không hỏi xác nhận, và không phải chức năng phục hồi nội dung.
Ý nghĩa của văn bản đầu ra và bộ đếm
Văn bản sau xử lý xuất hiện trong ô chỉ đọc và có thể được sao chép dưới dạng văn bản thuần. Bản mới có nút “Tải .txt” để tải văn bản sau xử lý về máy, cùng nút “Văn bản mẫu”, dòng thống kê “Ký tự: X → Y · Đã bớt: Z” và mục “Thứ tự xử lý” liệt kê đúng thứ tự các bước. Kiểu chữ, màu sắc, công thức bảng tính hay định dạng tài liệu không phải thành phần đầu ra được công cụ bảo toàn.
Bộ đếm đầu vào cập nhật khi nhập; bộ đếm đầu ra cập nhật ngay cùng lúc, vì bản mới tính trực tiếp. Cả hai đo số đơn vị mã UTF-16 và hiển thị số theo định dạng tiếng Việt. Độ dài giảm chỉ cho biết chuỗi đã ngắn hơn, không chứng minh nội dung đúng hoặc đầy đủ. Nếu cần kiểm tra riêng số từ, có thể tham khảo công cụ đếm số từ và ký tự, nhưng không nên xem số đếm là đánh giá chất lượng văn bản.

Các quy tắc làm sạch được áp dụng theo thứ tự nào?
Lọc chữ số, ký tự đặc biệt và dấu câu
Ba bước đầu đều chỉ chạy khi lựa chọn tương ứng được bật, theo thứ tự:
- Xóa chữ số: loại bỏ mọi ký tự số Unicode (nhóm \p{N}), kể cả chữ số ở hệ chữ khác hay ký tự số dạng ², Ⅳ; đây không phải bộ lọc chỉ giữ chữ.
- Lọc ký tự đặc biệt: chỉ giữ chữ cái Unicode, dấu kết hợp, ký tự thuộc nhóm số Unicode và khoảng trắng được nhận diện. Dấu câu và biểu tượng bị xóa.
- Xóa dấu câu cơ bản: xóa mọi dấu câu và ký hiệu (nhóm Unicode \p{P} và \p{S}), gồm chấm, phẩy, chấm than, chấm hỏi, hai chấm, chấm phẩy, gạch nối, gạch chéo, ngoặc, dấu nháy và nhiều ký hiệu như phần trăm, dấu bằng.
Các ký tự bị loại bỏ được thay bằng chuỗi rỗng, không được thay bằng dấu cách. Do đó, hai phần trước đây ngăn cách bởi ký hiệu có thể dính liền. Nếu bật cả lọc ký tự đặc biệt và xóa dấu câu, nhiều dấu đã bị xóa ở bước trước nên bước sau không còn gì để loại bỏ tại những vị trí đó.
Xử lý khoảng trắng và dòng
Ba bước tùy chọn tiếp theo xử lý bố cục văn bản:
- Bỏ khoảng trắng ở đầu từng dòng; ở cuối từng dòng chỉ bỏ một ký tự khoảng trắng.
- Đổi tab và khoảng trắng Unicode thành dấu cách thông thường, rồi đổi mỗi chuỗi từ hai dấu cách trở lên thành một dấu cách.
- Loại bỏ dòng trống bằng cách xóa các đoạn khoảng trắng đi kèm dấu xuống dòng phù hợp.
Bỏ khoảng trắng ở mép dòng khác với gom khoảng trắng giữa nội dung. Một tab đơn giữa hai từ không đủ điều kiện để bị gom ở bước thứ hai. Ngược lại, các khoảng trắng Unicode thường gặp (như khoảng trắng không ngắt dòng) được đổi thành dấu cách rồi gom cùng dấu cách thông thường. Xóa dòng trống cũng không nối mọi dòng thành một dòng duy nhất: các dòng có nội dung vẫn có thể giữ dấu xuống dòng giữa chúng.
Vì sao tắt mọi tùy chọn vẫn có thể đổi văn bản?
Bước thứ bảy luôn thực hiện: bỏ khoảng trắng ở hai đầu toàn bộ chuỗi. Vì thế, tắt cả sáu lựa chọn vẫn không bảo đảm giữ nguyên tuyệt đối đầu vào. Khoảng trắng bên trong thường không chịu các bộ lọc đã tắt, nhưng dấu cách, tab hoặc xuống dòng ở mép ngoài có thể bị cắt. Thứ tự trên cố định, không phụ thuộc việc người dùng chọn ô nào trước.

Ví dụ làm sạch văn bản và cách hiểu kết quả
Đoạn văn có khoảng trắng và dòng trống
Giả sử đầu vào là " Xin chào \n\n bạn ", trong đó \n biểu thị một lần xuống dòng, không phải hai ký tự được gõ trực tiếp. Dùng ba lựa chọn khoảng trắng mặc định và tắt cả ba bộ lọc nội dung, kết quả từ quy tắc là:
Xin chào bạn
Khoảng trắng ở đầu các dòng bị bỏ, ba dấu cách giữa “Xin” và “chào” trở thành một, còn dòng trống ở giữa bị loại bỏ. Ở cuối dòng đầu vẫn còn một dấu cách, vì bước bỏ khoảng trắng cuối dòng chỉ bỏ một ký tự. Hai dòng có chữ vẫn được giữ. Đầu ra dài 13 đơn vị mã UTF-16: tám đơn vị cho “Xin chào”, một cho dấu cách còn lại ở cuối dòng đầu, một cho xuống dòng và ba cho “bạn”. Đây là ví dụ suy ra từ mã.
Giá trị số và mã có ký hiệu phân cách
Với đầu vào Giá: 120.000đ?, giả sử bật xóa dấu câu cơ bản, tắt xóa số và lọc ký tự đặc biệt, đồng thời giữ nhóm khoảng trắng mặc định. Kết quả là Giá 120000đ. Dấu hai chấm, dấu chấm và dấu hỏi đều bị xóa, vì nhóm xóa dấu câu của bản mới gồm cả dấu câu và ký hiệu. Số tiền vẫn có các chữ số ban đầu nhưng không còn dấu phân cách hàng nghìn, nên hình thức trình bày đã thay đổi.
Với mã giả định mục-A/12, chỉ bật lọc ký tự đặc biệt và tắt năm lựa chọn còn lại. Kết quả là mụcA12: chữ và số còn lại, gạch nối cùng gạch chéo biến mất. Không có dấu cách mới được chèn vào. Ví dụ này cho thấy làm ngắn mã có thể làm mất cấu trúc nhận diện, dù các chữ và chữ số vẫn nguyên vẹn.
Chữ có dấu và số Unicode
Giả sử đầu vào là A1٢Ⅳ, bật xóa số và lọc ký tự đặc biệt, tắt những lựa chọn khác. Kết quả là A. Cả ba ký tự số — “1”, chữ số Ả Rập–Ấn “٢” và ký tự số La Mã Unicode “Ⅳ” — đều bị xóa ngay ở bước đầu, vì bước xóa số loại bỏ mọi ký tự thuộc nhóm số Unicode (nhóm \p{N}); không còn chữ số nào đến được bộ lọc tiếp theo.
Cuối cùng, so sánh hai đầu vào: “á” mã hóa sẵn và “a” đi kèm dấu sắc kết hợp U+0301. Khi chỉ bật lọc ký tự đặc biệt, cả hai đều cho “á”: bản mới chuẩn hóa NFC trước khi lọc nên “a” cộng dấu sắc được gộp thành “á”, và bộ lọc giữ cả dấu kết hợp (nhóm \p{M}). Hai dạng biểu diễn vì thế cho cùng một kết quả sau khi lọc.

Khi nào nên dùng công cụ làm sạch văn bản?
Làm gọn đoạn văn thông thường
Công cụ phù hợp khi một đoạn văn sao chép có nhiều dấu cách lặp hoặc khoảng trắng không cần thiết ở mép dòng. Với nội dung thông thường, nên ưu tiên nhóm khoảng trắng và giữ dấu câu, chữ số nếu chúng vẫn mang thông tin. Không cần bật bộ lọc ký tự chỉ vì muốn văn bản nhìn gọn hơn.
Nếu dòng trống đang phân biệt các đoạn, hãy cân nhắc tắt xóa dòng trống. Một thư trao đổi hoặc bài viết có thể cần khoảng nghỉ giữa các ý. Trước khi xử lý, nên giữ bản gốc; sau đó đọc lại các chỗ có số liệu, ký hiệu và chuyển đoạn. Đây là cách đối chiếu do người dùng thực hiện, không phải chức năng so sánh tự động của công cụ.
Chuẩn bị nội dung để dán sang ứng dụng khác
Có thể dùng kết quả khi cần chuyển một đoạn văn thuần sang biểu mẫu, trình soạn thảo hoặc ứng dụng ghi chú. Tuy nhiên, với danh sách phân cột bằng tab, cần kiểm tra ranh giới cột trước khi dán vào bảng tính. Việc gom khoảng trắng có thể biến một chuỗi tab thành dấu cách và làm thay đổi cách ứng dụng đích chia dữ liệu.
Mã sản phẩm, địa chỉ thư điện tử, đường dẫn và số tiền cần được xem xét riêng. Ký hiệu trong những chuỗi này thường là thành phần có nghĩa, không phải phần thừa. Nên chọn bộ lọc tối thiểu đáp ứng mục đích rồi kiểm tra cả đầu ra lẫn nội dung đã dán. Không có tính năng tự phát hiện ký hiệu quan trọng được xác nhận trong mã.

Làm sạch văn bản khác gì xử lý khoảng trắng trong Word, Excel và Python?
Khoảng trắng trong nội dung và khoảng trống do định dạng
Trong Word, dấu cách gõ giữa các từ là ký tự nội dung. Giãn dòng, khoảng cách trước hoặc sau đoạn, ngắt trang và chiều cao hàng trong bảng lại thuộc bố cục tài liệu. Công cụ này chỉ xử lý chuỗi văn bản được dán vào, không chỉnh các thuộc tính đó. Vì vậy, xóa khoảng trắng thừa cuối trang hoặc giữa các trang trong Word có thể cần xử lý ngay trong tài liệu.
Trong Excel, văn bản trong ô cũng khác với cấu trúc hàng cột, định dạng ô và công thức. Công cụ không mở bảng tính hay thao tác trực tiếp lên ô. Nếu sao chép nội dung từ bảng sang đây, phần được xử lý là chuỗi đã dán; không có bảo đảm bảo toàn cấu trúc bảng khi dán ngược lại.
Xử lý từng đoạn văn và xử lý dữ liệu có cấu trúc
Ở mức khái niệm, xử lý khoảng trắng trong Python thường phân biệt thao tác bỏ khoảng trắng đầu cuối với thao tác thay chuỗi khoảng trắng bên trong. Hai thao tác có mục tiêu khác nhau; phạm vi ký tự phụ thuộc quy tắc được chọn. Không nên mặc định mọi “hàm xóa khoảng trắng thừa” đều tương đương với sáu lựa chọn của công cụ này.
Hãy chọn phương pháp theo nhu cầu: công cụ văn bản phù hợp với một đoạn cần làm gọn; thao tác trong Word phù hợp khi cần giữ và sửa bố cục; công thức hoặc chương trình phù hợp hơn cho xử lý lặp lại trên dữ liệu có cấu trúc. Không có tích hợp tự động giữa công cụ này với Word, Excel hoặc Python được xác nhận.

Những giới hạn cần kiểm tra trước khi dùng kết quả
Mất thông tin và khác biệt Unicode
Rủi ro chính là xóa đúng ký tự theo bộ lọc nhưng sai với mục đích sử dụng. Dấu phân cách số, ký hiệu trong mã, tab phân cột và dòng trống phân đoạn đều có thể mang thông tin. Chữ dùng dấu kết hợp được giữ dấu khi lọc ký tự đặc biệt nhờ bước chuẩn hóa NFC. Công cụ không sửa chính tả, không khôi phục phần đã loại bỏ và không có chức năng hoàn tác được xác nhận.
Công cụ xử lý các khoảng trắng vô hình thường gặp theo hai cách: ký tự zero-width (như U+200B) bị xóa hẳn ngay từ đầu, còn khoảng trắng không ngắt dòng (NBSP) được đổi thành dấu cách rồi gom cùng dấu cách thông thường khi bật gom khoảng trắng. Nếu đoạn văn vẫn trông bất thường, cần xác định loại ký tự thay vì liên tục bật thêm bộ lọc có thể làm mất nội dung khác.
Sao chép, văn bản dài và quyền riêng tư
Cơ chế sao chép phụ thuộc khả năng của trình duyệt. Bản mới sao chép bằng Clipboard API kèm phương án dự phòng và chỉ báo thành công khi sao chép thật sự xong; nếu thất bại, thông báo nêu rõ việc sao chép không thành công và gợi ý chọn văn bản rồi sao chép thủ công. Với đầu ra rỗng, nút Sao chép bị vô hiệu nên không có thao tác sao chép nào chạy.
Không có giới hạn độ dài được khai báo trong phần mã cung cấp, nhưng điều đó không chứng minh công cụ xử lý tốt văn bản lớn tùy ý. Hiệu năng và tương thích thực tế chưa được xác minh. Tương tự, không thể kết luận toàn website không truyền hoặc lưu dữ liệu chỉ từ đoạn xử lý này. Nên tránh đưa thông tin nhạy cảm khi chưa rõ chính sách của website.

Câu hỏi thường gặp
Công cụ có xóa được khoảng trắng thừa cuối trang trong Word không?
Không trực tiếp, nếu khoảng trống đó xuất phát từ định dạng trang hoặc đoạn trong Word. Công cụ chỉ có thể xử lý dấu cách và xuống dòng thuộc phần văn bản bạn dán vào. Khoảng trống cuối trang có thể liên quan đến ngắt trang, khoảng cách đoạn hoặc bố cục bảng, nên cần xác định nguyên nhân trong tài liệu. Dán nội dung qua công cụ rồi dán lại cũng không bảo đảm giữ định dạng ban đầu; nên lưu một bản tài liệu trước khi thay thế nội dung.
Có thể gom dấu cách nhưng vẫn giữ các dòng trống giữa đoạn không?
Có. Bạn có thể bật gom khoảng trắng và tắt xóa dòng trống để giữ khoảng cách giữa các đoạn ở bên trong văn bản. Nếu chỉ muốn bỏ phần thụt dòng ngoài ý muốn, có thể chọn thêm bỏ khoảng trắng đầu cuối từng dòng. Tuy nhiên, các dòng trống ở đầu hoặc cuối toàn bộ chuỗi vẫn có thể bị loại bỏ bởi bước cắt khoảng trắng cuối cùng luôn chạy. Vì vậy, giữ dòng trống giữa đoạn không đồng nghĩa bảo toàn mọi khoảng trắng ở mép ngoài.
Bản mới xóa dấu câu như thế nào, dấu hỏi có bị xóa không?
Bản mới không còn giữ dấu hỏi: nhóm xóa dấu câu gồm mọi dấu câu và ký hiệu (Unicode P+S), nên dấu hỏi bị xóa cùng dấu hai chấm và dấu chấm. Nếu muốn giữ dấu hỏi, hãy tắt lựa chọn xóa dấu câu và chỉ dùng các bộ lọc khác.
Vì sao một số chữ tiếng Việt bị mất dấu khi lọc ký tự đặc biệt?
Nguyên nhân có thể là dấu được lưu dưới dạng ký tự kết hợp riêng, thay vì nằm trong một chữ cái mã hóa sẵn. Ở bản cũ, bộ lọc chỉ giữ chữ cái Unicode nên phần dấu kết hợp bị xóa; bản mới chuẩn hóa NFC và giữ dấu kết hợp nên trường hợp này không còn xảy ra. Hai chữ trông giống nhau trên màn hình vì thế có thể phản ứng khác nhau. Nếu cần bảo toàn tiếng Việt, hãy giữ bản gốc và kiểm tra đầu ra; không nên bật bộ lọc này chỉ để thu gọn dấu cách.
Tại sao vẫn còn ký tự số sau khi chọn xóa toàn bộ số?
Bản mới xóa mọi ký tự số Unicode (nhóm \p{N}) khi bật xóa số, kể cả chữ số ở hệ chữ khác. Số còn sót lại thường do lựa chọn xóa số chưa được bật, hoặc ký tự đó không thuộc nhóm số (ví dụ chữ cái có nét giống số). Với dữ liệu đa ngôn ngữ, vẫn nên kiểm tra đầu ra theo loại ký tự thực tế.
Tắt tất cả tùy chọn có giữ nguyên hoàn toàn văn bản không?
Không. Sau những bước tùy chọn, công cụ vẫn luôn cắt khoảng trắng ở hai đầu toàn bộ văn bản. Nếu đầu vào bắt đầu hoặc kết thúc bằng dấu cách, tab hay xuống dòng thuộc phạm vi được nhận diện, những phần đó có thể mất dù cả sáu ô đều tắt. Nội dung bên trong không bị các bộ lọc đã tắt xử lý, nhưng đó vẫn không phải chế độ sao chép nguyên trạng. Nếu cần giữ chính xác chuỗi, nên dùng bản gốc thay vì kết quả qua công cụ.
Đã hiện thông báo sao chép nhưng không dán được thì nên kiểm tra gì?
Trước tiên, kiểm tra ô đầu ra có nội dung và có đúng kết quả mới nhất hay không. Sau đó thử dán vào một ô văn bản đơn giản để phân biệt vấn đề sao chép với hạn chế của ứng dụng đích. Ở bản mới, thông báo thành công chỉ hiện khi sao chép thật sự xong; nếu thấy thông báo thất bại, hãy chọn nội dung trong ô kết quả và dùng thao tác sao chép thông thường của trình duyệt. Nếu vẫn không dán được, có thể chọn nội dung trong ô kết quả và dùng thao tác sao chép thông thường của trình duyệt, rồi kiểm tra lại phần vừa dán.
Tài liệu tham khảo
- String.prototype.normalize() — MDN Web Docs — https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
- Unicode character class escape: \p{…}, \P{…} — MDN Web Docs — https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Unicode_character_class_escape
- String: length — MDN Web Docs — https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length
- UTF-16 — Wikipedia — https://en.wikipedia.org/wiki/UTF-16
- Mã nguồn JavaScript của công cụ (text-cleaner-v2.js) — Công Cụ Việt — https://congcuviet.com/cong-cu/trinh-loai-bo-khoang-trang-thua-va-ky-tu-dac-biet/
