Làm cách nào để xem tệp văn bản cp1251 trong bảng điều khiển UTF-8?


7

Nỗ lực 1:

$ less subs.srt
"subs.srt" may be a binary file.  See it anyway? 
<C8><F2><E0><EB><FC><FF><ED> ...

Cố gắng 2:

$ LANG=ru_RU.CP1251 less subs.srt
����� �����, ��� ������.
��� ������� �������������! ...

Cách giải quyết:

$ iconv -f cp1251 < subs.srt | less

Làm thế nào để tôi làm điều đó thuận tiện?


1
Bạn có ý nghĩa gì với những gì được triệu tập bởi
ctrl-alt-delor

"Tiện lợi" Ý tôi là: 1. Tránh gõ các dòng lệnh dài; 2. Tránh giữ toàn bộ tập tin trong bộ nhớ; 3. Chấp nhận lesscác tùy chọn trên dòng lệnh theo cách thông thường.
Vi.

Câu trả lời:


7

Để thực hiện lesschạy mã hóa khác với thiết bị đầu cuối, hãy sử dụng luit (đi kèm với bộ tiện ích X11).

LANG=ru_RU.CP1251 luit less subs.srt

Nếu bạn muốn tự động phát hiện mã hóa, điều đó khó hơn, bởi vì một tệp văn bản không có dấu hiệu mã hóa. Phần mềm Enca cố gắng nhận dạng mã hóa của một tệp dựa trên ngôn ngữ của nó:

$ enca -L russian subs.srt
MS-Windows code page 1251
$ iconv -f "$(enca -iL russian subs.srt)" | less

Bạn có thể biến tổ hợp này thành một LESSOPENbộ lọc (xem Làm thế nào tôi có thể xem các tệp được nén bằng ít hơn mà không phải nhập zless? Ví dụ). Tuy nhiên, điều đó có thể không mang lại kết quả tốt cho văn bản không thực sự bằng tiếng Nga.

Nếu bạn chỉ sử dụng UTF-8 và CP1251, bạn có thể quay lại CP1251 khi một tệp không hợp lệ UTF-8 - có những lỗ hổng trong ứng dụng UTF-8 khiến cho hầu hết các tệp trong mã hóa 8 bit không hợp lệ UTF-8. Tập lệnh lọc bằng chứng khái niệm cho LESSOPEN(có thể không hoạt động trên các hệ thống khác ngoài Linux, vì nó phụ thuộc vào head -c Nviệc đọc chính xác N byte):

#!/bin/sh
head=$(head -c 1000)
if printf '%s\n' "$head" | grep -qav '^.*$'; then
  { printf '%s\n' "$head"; cat; } | iconv -f CP1251
else
  { printf '%s\n' "$head"; cat; }
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.