Cách chuyển đổi tệp 8 bit không xác định sang utf8


7

Tôi có một tệp .srt hiển thị như vô nghĩa khi tôi mở nó trong gEdit trong ubfox. Vì vậy, tôi muốn chuyển đổi nó thành utf8 để có thể đọc nó.

Khi tôi cố gắng tìm ra những gì mã hóa nó cung cấp:

file -i x.srt 
x.srt: text/plain; charset=unknown-8bit

Trong một nỗ lực khác, tôi đã tìm thấy:

find .  -type f -print | xargs file
./x.srt:   Non-ISO extended-ASCII text, with CRLF line terminators

Ngoài ra tôi đã thử enca:

enca x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.

enca -L Persian  x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.

Vì vậy, tôi tự hỏi làm thế nào để biết mã hóa và cuối cùng chuyển đổi nó sang một định dạng có thể sử dụng.


Bạn có thể xem mã nguồn của SubRip để xác định định dạng tệp hiện có: sourceforge.net/projects/subrip
William Deans

có quá nhiều ngôn ngữ trong 'ngôn ngữ liệt kê' ... có thể để viết tập lệnh bash để viết tất cả các kết quả trong một tệp và kiểm tra nó một cách trực quan sau khi ... một cái gì đó như "cho lang trong $ (enca --list languageas ); làm eca -L $ lang -; xong> tmp.txt "
Asain Kujovic

@OmerMerdan enca --list đưa ra danh sách 12 ngôn ngữ Slav cùng với tiếng Trung và other.
siêu thị

3
Ngôn ngữ nào là phụ đề được cho là? Bạn có thể gửi một mẫu (đầu ra của head -n 20 x.srt | od -tx1)?
Gilles 'SO- ngừng trở nên xấu xa'

Đối với tôi chỉ cố gắng đoán mã hóa chính xác làm việc, ví dụiconv -f iso-8859-1 -t utf-8 < file.txt > out.txt
BladeMight

Câu trả lời:


4

Không có cách đáng tin cậy để chuyển đổi từ một mã hóa không xác định sang một mã đã biết.

Trong trường hợp của bạn, nếu bạn biết văn bản gốc bằng tiếng Farsi / tiếng Ba Tư, có thể bạn có thể xác định một số mã hóa có thể và lặp lại trên đó cho đến khi bạn thấy đầu ra mà bạn mong đợi.

Dựa trên việc nhanh chóng, không có bộ chuyển đổi ổn định, tiêu chuẩn cho mã hóa Hệ thống Iran kế thừa và thay thế phổ biến duy nhất còn lại là Windows codepage 1256 . Tôi đã đưa MacArabic vào đây chủ yếu cho mục đích minh họa (mặc dù có lẽ nó cũng là một lựa chọn khả thi cho Farsi?)

for encoding in cp1256 macarabic; do
    if iconv -f "$encoding" -t utf-8 inputfile >outputfile."$encoding"; then
        echo "$encoding: possible"
    else
        echo "$encoding: skipped"
        rm outputfile."$encoding"
    fi
done

(Phiên bản của iconvtôi không thực sự hỗ trợ MacArabic, nhưng có lẽ bạn sẽ gặp nhiều may mắn hơn hoặc bạn có thể thử một công cụ chuyển đổi khác.)

Kiểm tra các tập tin đầu ra kết quả; xem nếu một trong số họ dường như có ý nghĩa.

Nếu bạn biết đầu ra sẽ trông như thế nào, bạn cũng có thể tra cứu các ánh xạ riêng lẻ cho các byte trong tệp. Nếu byte đầu tiên là 0x94 và bạn biết nó sẽ hiển thị dưới dạng về cơ bản bạn đã thiết lập rằng mã hóa là Hệ thống Iran. Có thể tra cứu thêm một vài byte để xác minh kết luận này. Trang Wikipedia cho mã hóa này có một bảng gồm tất cả các ký tự. Rõ ràng, đây là khó khăn, chậm và dễ bị lỗi, đặc biệt là nếu có nhiều mã hóa ứng cử viên để lựa chọn.

Đối với một số mã hóa, bạn có thể tìm thấy một danh sách, ví dụ như tại https://tripleee.github.io/8bit/ - đối với những người khác, có thể bạn chỉ cần xem các bảng mã Wikipedia tương ứng.


2

Một tập tin trong một trang mã 8 bit không xác định được xác định là một ẩn số của 8 không rõ ràng vì một lý do: đó không phải là một vấn đề dễ dàng nếu không có bất kỳ ý tưởng nào về ngôn ngữ. Không thể nói là không thể, nhưng để hoạt động hiệu quả, máy dò tìm heuristic như vậy phải có vốn từ vựng lớn về tất cả các ngôn ngữ được sử dụng nhiều nhất, một danh sách lớn các trang mã và biết một số ngữ pháp. Cập nhật: chưa từng thử enca; có thể đó là một bộ giải mã kỳ diệu được thực hiện dọc theo các dòng này. Nhưng nếu tệp đại diện, giả sử, mã nguồn chủ yếu là ASCII chỉ có một hoặc hai từ được tạo từ các octet có bit cao, thì hầu như không thể đoán ngôn ngữ và mã hóa ngay cả với thuật toán heuristic kỳ diệu như vậy. Đó là lý do tại sao HTTP / 1.1 ban đầu khăng khăng đòi khai báo bộ ký tự trong Content-Type:tiêu đề HTTP cho bất kỳ text/loại phương tiện * nào .

Vì vậy, giải pháp, bằng điểm:

  1. Điều tra / tìm hiểu / đoán ngôn ngữ nào mà tập tin được mã hóa. Ở đây một trí thông minh của con người là rất quan trọng. Ít nhất là biên soạn một danh sách một vài giả thuyết hợp lý.
  2. Lập danh sách các mã hóa được sử dụng bởi (các) ngôn ngữ.
  3. Hãy thử các mã hóa sau: thử headtệp (biến môi trường LANG được giả sử là được đặt tương ứng với TUI được sử dụng) và xem liệu kết quả có thể đọc được hay không, cho đến khi thành công.|iconv -f

Tất nhiên, giải pháp này giả định rằng văn bản được mã hóa đúng nhưng trong một trang mã không xác định . Các trường hợp văn bản bị cắt xén do lỗi của con người hoặc do trục trặc phần mềm không thể được giải quyết theo cách này.

Các điểm 2. và 3. có thể được tự động hóa và các công cụ như vậy tồn tại, nhưng thực tế chúng là ngôn ngữ cụ thể (nghĩa là bộ giải mã heuristic cho tiếng Nga sẽ không hoạt động cho tiếng Nhật và ngược lại) hoặc, ít nhất, yêu cầu chỉ định đầu vào ngôn ngữ (như enca ).

Đối với ngôn ngữ Ba Tư, các mã hóa có thể bao gồm Windows-1256 (xem chủ đề này ), ISO 8859-6 và hiện đã bị mã hóa Hệ thống Iran lỗi thời . Hãy vui mừng ở đây, bạn chưa có danh sách ít nhất bảy trang mã được sử dụng cho tiếng Nga (KOI7, KOI8, CP866, Windows-1251, ISO 8859-5, MacCyrillic, MIK).


1

có thể để kiểm tra trực quan tất cả ~ 1000 khả năng của iconv, bằng cách liệt kê 20 dòng đầu tiên của mỗi dòng ... được hợp nhất với kết quả all.txt.

#!/usr/bin/env bash
                      line=$(printf "=%.0s" {1..50})
for FMT in $(iconv -l); do    
                   echo "$line\nFormat $FMT:\n$line"
   iconv -f $FMT -t UTF8 < inputFile.srt | head -n20
done > all.txt

#gedit all.txt

... Và tìm ra định dạng nào là đúng (nếu bạn có thể nhận ra Ba Tư).


Đây là quá mức cần thiết - iconv -lđưa ra một số lượng lớn các bí danh trùng lặp hiệu quả, cũng như các ứng cử viên rõ ràng không có khả năng như các bảng mã khác nhau của CJKV.
tripleee
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.