Làm cách nào để thay đổi mã hóa từ văn bản ASCII mở rộng không phải ISO, với các đầu cuối dòng CRLF thành UTF-8?


21

Tôi có một tệp txt:

$ file -i x.txt
x.txt: text/plain; charset=unknown-8bit
$ file x.txt 
x.txt: Non-ISO extended-ASCII text, with CRLF line terminators

Và có một số ký tự được mã hóa không chính xác:

trwa³y, sta³y, usuwaæ

Làm cách nào để thay đổi mã hóa của tệp này thành UTF-8? Tôi đã thử cách sau đây cho đến nay:

$ iconv -f ASCII -t UTF-8 x.txt
                puiconv: illegal input sequence at position 4

Có lẽ tôi nên sử dụng extended ASCII( high ASCII) nhưng không thể tìm thấy nó trong iconvdanh sách mã hóa.


2
bạn có thể tải tập tin ở đâu đó không?
janos

Có một danh sách tiện dụng các mã hóa ISO 8 bit, tất cả được hiển thị cạnh nhau, ở đây . Có ai trong số họ nhìn gần với những gì bạn quan sát trong tập tin của bạn? Ví dụ: nếu bạn nghĩ "sta³y" phải là "stacy", thì hãy tìm mã hóa nào có "c" cho bất kỳ mã hex lạ nào trong từ đó.
John1024

Có lẽ 90% thời gian, "Văn bản ASCII không mở rộng ISO" sẽ là một tệp được mã hóa trong bảng mã Windows 1252 . "Đây có lẽ là mã hóa ký tự 8 bit được sử dụng nhiều nhất trên thế giới." (Wikipedia). Hãy thử đầu tiên:iconv -f windows-1252 -t utf-8 file
nyov

Câu trả lời:


33

file nói với bạn văn bản của Non-ISO mở rộng-ASCII vì nó phát hiện ra rằng đây là:

  • rất có thể là một tập tin văn bản của người Viking từ việc thiếu các ký tự điều khiển (giá trị byte 0 mộc31) ngoài các ngắt dòng;
  • Phần mở rộng của ASC-ASCII vì có các ký tự nằm ngoài phạm vi ASCII (giá trị byte ≥128);
  • Không phải ISO ISO vì có các ký tự trong phạm vi 128.100159 ( ISO 8859 dành phạm vi này cho các ký tự điều khiển).

Bạn phải tìm ra mã hóa mà tập tin này dường như đang ở. Bạn có thể thử nhận dạng tự động của Enca . Bạn có thể cần phải đẩy nó đi đúng hướng bằng cách nói với ngôn ngữ của văn bản.

enca x.txt
enca -L polish x.txt

Để chuyển đổi tập tin, vượt qua -xtùy chọn:enca -L polish x.txt -x utf8 >x.utf8.txt

Nếu bạn không thể hoặc không muốn sử dụng Enca, bạn có thể đoán mã hóa theo cách thủ công. Một chút nhìn xung quanh nói với tôi rằng đây là văn bản tiếng Ba Lan và các từ là trwały, stały, usuważ, vì vậy chúng tôi đang tìm một bản dịch trong đó ³łæż. Điều này trông giống như latin-2 hoặc latin-10 hoặc nhiều khả năng (được đưa ra là không phải ISO ISO CP1250 mà bạn đang xem là latin1 . Để chuyển đổi tệp thành UTF-8, bạn có thể sử dụng recode hoặc iconv .

recode CP1250..utf8 <x.txt >x.utf8.txt
iconv -f CP1250 -t UTF-8 <x.txt >x.utf8.txt

Tôi không tham gia với < x.txt > x.utf8.txtTại sao chúng ta sử dụng <và sau đó >? Làm thế nào nó hoạt động?
Filip Bartuzi


1

Mở tệp văn bản bằng gedit và trong hộp thoại "lưu dưới dạng .." bạn sẽ thấy mã hóa hiện tại.


0

Bạn đã thử tìm hiểu mã hóa chính xác là x.txt chưa? Bạn sẽ nhận được một danh sách các mã hóa được hỗ trợ với

iconv - danh sách

Đôi khi nó xảy ra với tôi rằng tôi có một sự không phù hợp giữa latin1 và utf8. Sau đó, nó thường giúp chuyển đổi nó từ và trở lại utf8 và ngược lại.


0

Tôi đã tạo tập lệnh chuyển đổi tự động bằng thư viện enca , tôi sử dụng tập lệnh này trên NAS để chuyển đổi phụ đề sang UTF-8 nhưng nó có thể được sử dụng cho mọi chuyển đổi tự động

Hãy sử dụng :)

CHỈNH SỬA:

#!/bin/bash
LANGUAGE=czech
TO=utf8
CONVERT="enca -L $LANGUAGE -x $TO"

# Find and onvert
find ./ -type f -name "*.srt" | while read fn; do
  IS_TARGET=`enca "${fn}" | egrep -ow -m 1 'UTF-8|Unrecognized|KOI8-CS2|7bit ASCII|UCS-2|Macintosh Central European'`

    if [ "$IS_TARGET" != "UTF-8" ] &&
       [ "$IS_TARGET" != "UCS-2" ] &&
       [ "$IS_TARGET" != "Macintosh Central European" ] &&
       [ "$IS_TARGET" != "Unrecognized" ] &&
       [ "$IS_TARGET" != "7bit ASCII" ] &&
       [ "$IS_TARGET" != "KOI8-CS2" ]; then

        echo "${fn} ---- Will be converted!"
    # optional backup of original srt
        # cp "${fn}" "${fn}.bak"
        $CONVERT "${fn}"
    fi  

done
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.