Chuyển đổi mã hóa tệp văn bản


15

Tôi thường xuyên gặp các tệp văn bản (chẳng hạn như các tệp phụ đề bằng ngôn ngữ mẹ đẻ của tôi, tiếng Ba Tư ) với các vấn đề mã hóa ký tự. Các tệp này được tạo trên Windows và được lưu với mã hóa không phù hợp (dường như là ANSI), trông có vẻ vô nghĩa và không thể đọc được, như thế này:

nhập mô tả hình ảnh ở đây

Trong Windows, người ta có thể khắc phục điều này một cách dễ dàng bằng Notepad ++ để chuyển đổi mã hóa thành UTF-8, như dưới đây:

nhập mô tả hình ảnh ở đây

Và kết quả chính xác có thể đọc được là như thế này:

nhập mô tả hình ảnh ở đây

Tôi đã tìm kiếm rất nhiều giải pháp tương tự trên GNU / Linux, nhưng tiếc là các giải pháp được đề xuất (ví dụ câu hỏi này ) không hoạt động. Trên hết, tôi đã thấy mọi người đề nghị iconvrecodetôi không gặp may mắn với những công cụ này. Tôi đã thử nghiệm nhiều lệnh, bao gồm cả các lệnh sau, và tất cả đều thất bại:

$ recode ISO-8859-15..UTF8 file.txt
$ iconv -f ISO8859-15 -t UTF-8 file.txt > out.txt
$ iconv -f WINDOWS-1252 -t UTF-8 file.txt > out.txt 

Không ai trong số này làm việc!

Tôi đang sử dụng Ubuntu-14.04 và tôi đang tìm kiếm một giải pháp đơn giản (GUI hoặc CLI) hoạt động giống như Notepad ++.

Một khía cạnh quan trọng của việc "đơn giản" là người dùng không bắt buộc phải xác định mã hóa nguồn; thay vào đó, mã hóa nguồn phải được công cụ tự động phát hiện và chỉ mã hóa đích được cung cấp bởi người dùng. Nhưng tuy nhiên, tôi cũng sẽ vui mừng khi biết về một giải pháp hoạt động đòi hỏi phải cung cấp mã hóa nguồn.

Nếu ai đó cần một trường hợp thử nghiệm để kiểm tra các giải pháp khác nhau, ví dụ trên có thể truy cập được thông qua liên kết này .


2
Hãy thử : vim '+set fileencoding=utf-8' '+wq' file.txt.
muru

Farsi nên iso-639nhưng dường như không có sẵn trong một iconvhoặc recode. Ít nhất, tôi không thấy nó trong đầu ra của iconv -l.
terdon

@muru Tôi đã thử đề xuất của bạn với vimnhưng nó không hoạt động.
Seyed Mohammad

@SeyedMohammad trông vẫn thế?
muru

@muru Yup! Không thay đổi.
Seyed Mohammad

Câu trả lời:


12

Các tệp Windows có văn bản tiếng Ba Tư này được mã hóa trong Windows-1256 . Vì vậy, nó có thể được giải mã bằng lệnh tương tự như OP đã thử, nhưng với các bộ ký tự khác nhau. Cụ thể là:

recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(tố cáo khiếu nại của người đăng ban đầu; xem bình luận)

iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt

Điều này giả định rằng biến môi trường LANG được đặt thành ngôn ngữ UTF-8. Để chuyển đổi sang bất kỳ mã hóa nào (UTF-8 hoặc cách khác), bất kể ngôn ngữ hiện tại, người ta có thể nói:

iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}

Poster gốc cũng bị nhầm lẫn với ngữ nghĩa của các công cụ mã hóa văn bản (recode, iconv). Đối với mã hóa nguồn ( nguồn.. hoặc -f), người ta phải chỉ định mã hóa mà tệp được lưu (bởi chương trình đã tạo nó). Không phải một số (ngây thơ) đoán dựa trên các nhân vật mojibake trong các chương trình cố gắng (nhưng không thành công) để đọc nó. Việc thử ISO-8859-15 hoặc WINDOWS-1252 cho một văn bản tiếng Ba Tư rõ ràng là một sự bế tắc: những mã hóa này chỉ không chứa bất kỳ chữ cái Ba Tư nào.


@Seyed Mohammad: bây giờ với các lệnh được chỉ định rõ ràng.
Incni Mrsi 19/08/2015

Cảm ơn! Lệnh thứ hai (một sử dụng iconv) đã làm việc. Nhưng cái đầu tiên (sử dụng recode) không hoạt động chính xác và đầu ra vẫn vô nghĩa. Chỉnh sửa câu trả lời của bạn để chỉ bao gồm iconvlệnh và tôi sẽ đánh dấu nó là câu trả lời.
Seyed Mohammad

1
Ngoài ra, để không có cài đặt biến LANG, người ta có thể làm: iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txtđiều mà tôi đã thử nghiệm và làm việc. Vì vậy, nó có thể là một ý tưởng tốt để chỉnh sửa lệnh của bạn như thế này.
Seyed Mohammad

Tôi đã viết một kịch bản hữu ích dựa trên lệnh làm việc mà tôi đã giải thích trong một câu trả lời khác ở đây. Tôi hy vọng nó sẽ giúp những người dùng Linux Ba Tư khác vì nó giúp tôi rất nhiều.
Seyed Mohammad

@karel: Cảm ơn, tiếng phàn nàn của người Anh là một động từ - cụm từ được viết một cách vô văn hóa.
Incni Mrsi

1

Ngoài ra iconv, đây là một công cụ rất hữu ích cho riêng mình hoặc trong một tập lệnh, có một giải pháp thực sự đơn giản mà tôi tìm thấy khi cố gắng tìm ra vấn đề tương tự cho các bộ ký tự Hy Lạp (Windows-1253 + ISO-8859-7).

Tất cả bạn cần làm là để mở tập tin văn bản thông qua "Open" hộp thoại Gedit củakhông phải bằng cách nhấp đúp vào nó . Ở dưới cùng của hộp thoại có một thả xuống cho Mã hóa, được đặt thành "Tự động phát hiện" . Thay đổi nó thành "Windows-125x" hoặc bộ mã phù hợp khác và văn bản sẽ hoàn toàn dễ đọc trong Gedit. Sau đó, bạn có thể lưu nó bằng mã hóa UTF-8, để chắc chắn rằng bạn sẽ không gặp lại vấn đề tương tự trong tương lai ...


1

Là một giải pháp bổ sung cho vấn đề, tôi đã chuẩn bị một tập lệnh Bash hữu ích dựa trên iconvmệnh lệnh từ câu trả lời của Incni Mrsi :

#!/bin/bash

if [ $# -lt 1 ]
then
   echo 'Specify at least one file to fix.'
   exit 1
fi

# Temp file to store conversion attempt(s).
tmp='tmp.fixed'

for file in "$@"
do
  # Try to fix the file encoding.
  if iconv -f WINDOWS-1256 "$file" -t UTF-8 > $tmp; then
    echo "Fixed: '$file'"
    cat $tmp > "$file"
  else
    echo "Failed to fix: '$file'"
  fi
done
rm $tmp

Lưu tập lệnh này dưới dạng fix-encoding.sh, cho phép nó thực thi quyền sử dụng chmod +x fix-encoding.shvà sử dụng nó như thế này:

./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub

Kịch bản lệnh này sẽ cố gắng sửa mã hóa của bất kỳ số lượng tệp nào được cung cấp làm đầu vào. Lưu ý rằng các tệp sẽ được cố định tại chỗ, vì vậy nội dung sẽ bị ghi đè.


Bạn không cần phải đưa tập tin $ ra khỏi "  Vượt  " vì các biến được mở rộng dưới dấu ngoặc kép cũng như trong văn bản mở. Chỉ '$ file' sẽ được hiển thị theo nghĩa đen, bằng ký hiệu đô la, bằng bash.
Incni Mrsi

Như tôi đã đề cập để trả lời câu trả lời được đăng bởi 'Incni Mrsi', giải pháp đó đã không hoạt động và kịch bản này cũng vậy.
Seyed Mohammad

1

Tôi không biết nếu điều này hoạt động với Farsi: Tôi sử dụng Gedit, nó có lỗi với mã hóa sai và tôi có thể chọn những gì tôi muốn dịch sang UTF-8, đó chỉ là định dạng văn bản không sáng, nhưng đây là ảnh chụp màn hình !

nhập mô tả hình ảnh ở đây

Xin lỗi tôi cuối cùng đã thông qua các tập tin văn bản của tôi, vì vậy bây giờ tất cả chúng đều được chuyển đổi.

Tôi cũng thích notepad ++, vẫn nhớ nó.


Gedit không thể khắc phục vấn đề. Mặc dù Gedit không hiển thị lỗi mã hóa cho tệp của tôi, ngay cả khi nó không thể sửa được. Tôi cũng đã thử "lưu dưới dạng" với mã hóa UTF-8 trong Gedit, nhưng nó không khắc phục được sự cố.
Seyed Mohammad

1

Nếu bạn thích làm việc trong GUI thay vì CLI, như tôi làm:

  1. Mở tệp bằng Geany (trình chỉnh sửa)
  2. Chuyển đến menu Tệp -> Tải lại dưới dạng
  3. Chọn mã hóa giả định để thay đổi tiếng vô nghĩa thành các ký tự nhận dạng trong ngôn ngữ của bạn. Ví dụ: để đọc chương trình phụ Hy Lạp, tôi sẽ tải lại dưới dạng Tây Âu -> Hy Lạp (Windows-1253)
  4. Chuyển đến menu Tài liệu > Đặt Mã hóa -> Unicode -> UTF-8
  5. Tiết kiệm

Không hoạt động ..
Aurimas

0

Giải pháp làm việc tôi tìm thấy là sử dụng trình soạn thảo văn bản Microsoft Visual Studio Code là Phần mềm miễn phí và có sẵn cho Linux.

Mở tệp bạn muốn chuyển đổi mã hóa của nó trong VS-Code. Ở dưới cùng của cửa sổ, có một vài nút. Một trong số chúng có liên quan đến mã hóa tập tin, như hình dưới đây:

nhập mô tả hình ảnh ở đây

Nhấp vào nút này sẽ bật lên một menu trên cao bao gồm hai mục. Từ menu này, chọn tùy chọn "Mở lại bằng mã hóa", giống như bên dưới:

nhập mô tả hình ảnh ở đây

Điều này sẽ mở một menu khác bao gồm một danh sách mã hóa khác nhau, như hiển thị bên dưới. Bây giờ chọn "Tiếng Ả Rập (Windows 1256)":

nhập mô tả hình ảnh ở đây

Điều này sẽ sửa văn bản vô nghĩa như thế này:

nhập mô tả hình ảnh ở đây

Bây giờ bấm vào nút mã hóa một lần nữa và lần này chọn tùy chọn "Lưu với mã hóa", như bên dưới:

nhập mô tả hình ảnh ở đây

Và trong menu mới, chọn tùy chọn "UTF-8":

nhập mô tả hình ảnh ở đây

Điều này sẽ lưu tệp đã sửa bằng mã hóa UTF-8:

nhập mô tả hình ảnh ở đây

Làm xong! :)


Đã thử "Lưu với mã hóa" nhưng nó hiển thị agian mã hóa trước đó, trong trường hợp của tôi là UTF8
chaitanya
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.