Có một lệnh Linux để tìm hiểu xem một tập tin là UTF-8 không?


14

Các .initập tin Joomla yêu cầu phải được lưu dưới dạng UTF-8.

Sau khi chỉnh sửa, tôi không chắc các tệp đó có phải là UTF-8 hay không.

Có một lệnh Linux như filehoặc một vài lệnh sẽ cho biết một tệp có thực sự là UTF-8 hay không?


4
Bạn không thể nói mã hóa của một tập tin. Bạn chỉ có thể đoán một cách thông minh. Bạn có thể đoán đúng, nhưng đôi khi đoán không thành công. filelà một ví dụ về một chương trình làm dự đoán thông minh.
Marco

1
@Marco: Tuy nhiên, có thể xác minh xem nó có hợp lệ UTF-8 hay không. Có một số mã hóa có thể chuyển nhầm thành UTF-8 hợp lệ, nhưng hầu như không bao giờ xảy ra với bảng mã / bảng mã ISO-8859-𝒏 hoặc Windows-125𝒏.
dùng1686

Câu trả lời:


28

Bạn có thể xác định mã hóa tập tin bằng lệnh sau:

file -bi filename

3
@nicolas Đối với MacOS bạn có thể thử file -I filename(-Tôi là thủ đô i).
Rik

5
Điều này có đọc toàn bộ tập tin không?
ctrl-alt-delor 30/03/18

2
@ kojow7 utf-8 không có tiêu đề. ASCII thuần túy (chỉ 7 bit), không thể phân biệt được với utf-8 (đó là điểm của nó, một tiêu đề sẽ gây ra tất cả các loại vấn đề). Vì vậy, nếu bạn có một tệp là ASCII cho MB đầu tiên thì có một ký tự UTF-8, thì bạn sẽ không biết, trừ khi bạn đọc toàn bộ tệp.
ctrl-alt-delor

3
Điều này không nên được chấp nhận là câu trả lời. Lệnh 'file' không làm điều đó; nó chỉ đọc một phần của tập tin và sử dụng các số ma thuật để đoán chính xác nhất. Thỉnh thoảng 'tập tin' có thể và sẽ cung cấp cho bạn câu trả lời không chính xác. Để xác minh xem một tệp có vượt qua mã hóa như ascii, iso-8859-1, utf-8 hay bất cứ điều gì thì một giải pháp tốt là sử dụng lệnh 'iconv'.
Tim

1
Tôi đã thử nó, và nó có thể và không thành công.
Tim

9

@davidpostill Tôi tò mò, có phải là thực hành xấu để trích dẫn tác giả trong tài liệu tham khảo?
Pablo Olmos de Aguilera C.

Không. Tuy nhiên, đó là một thực hành tốt để làm cho liên kết nói nó dẫn tôi đến đâu. Giả sử tôi chỉ đọc văn bản màu xanh. Sau khi chỉnh sửa, tôi có thể cho biết tại sao và khi nào tôi nên nhấp vào đó. Trước đây, tôi không thể. (Không phải tôi là người thực hiện chỉnh sửa nhưng tôi chắc chắn 94% rằng đây là nội dung của nó.)
Hermann Döppes

Đẹp, và hoạt động độc đáo với find -type f -exec isutf8 {} +, bởi vì nó cũng trích dẫn tên tệp. (Và với việc sử dụng find ... -exec ... +cũng nhanh chóng)
Tomasz Gandor

2

Không sử dụng filelệnh. Nó không kiểm tra toàn bộ tập tin, và về cơ bản nó đoán. Nó đôi khi đưa ra câu trả lời không chính xác.

Bạn có thể xác minh nếu một tệp xảy ra để vượt qua mã hóa UTF-8 như thế này:

$ iconv -f utf8 <filename> -t utf8 -o /dev/null

Mã trả về bằng 0 có nghĩa là nó vượt qua UTF8. Mã trả về khác không có nghĩa là nó không hợp lệ UTF8.

Không thể biết liệu một tệp có nhất thiết phải được xuất bằng cách sử dụng bất kỳ lược đồ mã hóa cụ thể nào không, vì một số lược đồ mã hóa chồng chéo. Để làm điều đó sẽ yêu cầu siêu dữ liệu được nhúng vào tệp và thậm chí sau đó bạn sẽ đặt niềm tin vào bất cứ ai tạo ra tệp đó, thay vì tự xác thực nó ... và bạn phải luôn xác thực nó.


0

Tuy nhiên, một cách khác là sử dụng recode, nó sẽ thoát với một lỗi nếu nó cố giải mã UTF-8 và gặp các ký tự không hợp lệ.

if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
    echo "Valid utf8 : $FILE"
else
    echo "NOT valid utf8: $FILE"
fi
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.