Cách xóa các ký tự không phải UTF-8 khỏi tệp văn bản


84

Tôi có một loạt các tệp tiếng Ả Rập, tiếng Anh, tiếng Nga được mã hóa bằng utf-8. Đang cố gắng xử lý các tệp này bằng tập lệnh Perl, tôi gặp lỗi sau:

Malformed UTF-8 character (fatal)

Kiểm tra nội dung của các tệp này theo cách thủ công, tôi tìm thấy một số ký tự lạ trong đó. Bây giờ tôi đang tìm cách tự động xóa các ký tự này khỏi tệp.

Có cách nào để làm điều đó?


2
Có lẽ nó giống như thế này: stackoverflow.com/questions/7656283/...
Olaf Dietsche


4
Các ký tự không phải UTF-8 là gì? Tất cả các ký tự trong một chuỗi UTF-8 được định dạng tốt là các ký tự UTF-8 (thực sự là Unicode)! Một số trong số đó là UTF-8 mã hóa trong một vài byte liên tiếp ....
Basile Starynkevitch

3
@BasileStarynkevitch: thông báo lỗi nêu rõ rằng có một ký tự UTF-8 không đúng định dạng. Điều đó có nghĩa là một byte đã xuất hiện không thể xuất hiện như một phần của tệp UTF-8 hợp lệ. Điều đó không khó; nó có thể là một byte 0xC0 hoặc 0xC1, hoặc 0xF5..0xFF, hoặc sự cố trình tự với các byte sẽ hợp lệ.
Jonathan Leffler

Câu trả lời:


156

Lệnh này:

iconv -f utf-8 -t utf-8 -c file.txt

sẽ xóa tệp UTF-8 của bạn, bỏ qua tất cả các ký tự không hợp lệ.

-f is the source format
-t the target format
-c skips any invalid sequence

11
"iconv -f utf-8 -t utf-8 -c file.txt" trên máy Mac. gạch nối giữa 'f' và '8'
Colin

1
Thuận bạn có thể chuyển nội dung vào clipboard trên máy Mac làm như vậy: pbpaste | iconv -f utf-8 -t -utf-8 -c | pbcopy. Tôi cũng đã tạo quy trình làm việc Alfred với lối tắt chung để loại bỏ tất cả các ký tự đặc biệt bằng cách nhắm mục tiêu ascii.
Lenar Hoyt,

1
Điều này tạo ra một tệp hoàn toàn trống cho tôi. Chỉ muốn cho mọi người biết điều này có khả năng phá hủy và sao lưu tệp của họ trước khi chạy nó trên đó.
counterbeing

5
iconv -f utf-8 -t ascii//TRANSLITđã giải quyết vấn đề của tôi. Nó chuyển đổi dấu ngoặc kép thành dấu ngoặc kép thẳng.
Colonel Panic

5
-ocho file xuất khác nhau
codaamok

0

Phương thức của bạn phải đọc từng byte một và hiểu đầy đủ và đánh giá cao cấu trúc khôn ngoan từng byte của các ký tự. Phương pháp đơn giản nhất là sử dụng một trình soạn thảo sẽ đọc mọi thứ nhưng chỉ xuất ra các ký tự UTF-8. Textpad là một trong những lựa chọn.


iconv không có sẵn trong cygwin. Có cách nào để làm điều này trên windows / cygwin không? Tôi có một tệp XML lớn (hơn 100000 dòng) cần loại bỏ các ký tự không hợp lệ. Tôi không quan tâm đến utf-8 hợp lệ. Tôi đã thiết lập notepad ++ để utf-8, nhưng ngay cả sau khi lưu nó từ đó tôi vẫn nhận sai sót trong phân tích cú pháp XML
mljm

ubuntu WSL trên Windows nó đi kèm với iconv
Kat Lim Ruiz

-4
cat foo.txt | strings -n 8 > bar.txt

sẽ thực hiện công việc.


10
Không, điều này cũng sẽ giết rất nhiều ký tự utf-8 hợp lệ.
Zack Burt
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.