Batch-convert tập tin để mã hóa


46

Làm cách nào tôi có thể chuyển đổi hàng loạt tệp trong một thư mục để mã hóa chúng (ví dụ ANSI-> UTF-8) bằng lệnh hoặc công cụ?

Đối với các tệp đơn, trình soạn thảo sẽ trợ giúp, nhưng làm thế nào để thực hiện công việc tệp hàng loạt?



Câu trả lời:


36

Cygwin hoặc GnuWin32 cung cấp các công cụ Unix như iconvdos2unix(và unix2dos). Trong Unix / Linux / Cygwin, bạn sẽ muốn sử dụng "windows-1252" làm mã hóa thay vì ANSI (xem bên dưới). (Trừ khi bạn biết hệ thống của bạn đang sử dụng một bảng mã khác so với 1252 như bảng mã mặc định của nó, trong trường hợp này bạn sẽ cần phải nói với iconv các bảng mã ngay để dịch từ.)

Chuyển đổi từ một ( -f) sang khác ( -t) với:

$ iconv -f windows-1252 -t utf-8 infile > outfile

Hoặc ở dạng tìm tất cả và chinh phục:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;

Cách khác:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;

Câu hỏi này đã được hỏi nhiều lần trên trang web này, vì vậy đây là một số thông tin bổ sung về "ANSI". Trả lời một câu hỏi liên quan, CesarB đề cập :

Có một số mã hóa được gọi là "ANSI" trong Windows. Trong thực tế, ANSI là sự nhầm lẫn . iconv không có cách đoán mà bạn muốn.

Mã hóa ANSI là mã hóa được sử dụng bởi các chức năng "A" trong API Windows (các chức năng "W" sử dụng UTF-16). Mã hóa tương ứng với nó thường phụ thuộc vào ngôn ngữ hệ thống Windows của bạn. Phổ biến nhất là CP 1252 (còn được gọi là Windows-1252). Vì vậy, khi trình soạn thảo của bạn nói ANSI, nó có nghĩa là "bất cứ chức năng API nào sử dụng làm mã hóa ANSI mặc định", đó là mã hóa phi Unicode mặc định được sử dụng trong hệ thống của bạn (và do đó thường là mã được sử dụng cho các tệp văn bản).

Các trang liên kết đến các anh cho miếng ngon này lịch sử (trích dẫn từ một Microsoft PDF ) về nguồn gốc của CP 1252 và ISO-8859-1, một mã hóa oft-đã qua sử dụng:

[...] điều này xuất phát từ thực tế là trang mã Windows 1252 ban đầu được dựa trên một bản nháp ANSI, đã trở thành Tiêu chuẩn ISO 8859-1. Tuy nhiên, khi thêm các điểm mã vào phạm vi dành riêng cho các mã điều khiển trong tiêu chuẩn ISO, trang mã Windows 1252 và các trang mã Windows tiếp theo ban đầu dựa trên loạt ISO 8859-x bị lệch so với ISO. Cho đến ngày nay, không có gì lạ khi có cộng đồng phát triển, cả trong và ngoài Microsoft, nhầm lẫn trang mã 8859-1 với Windows 1252, cũng như xem "ANSI" hoặc "A" được sử dụng để biểu thị hỗ trợ trang mã Windows .


4
Đừng sử dụng cùng tên tệp như đầu vào và đầu ra! iconvdường như cắt ngắn các tệp thành 32.768 byte nếu chúng vượt quá kích thước này. Khi anh ta viết trong tập tin mà anh ta đang cố đọc, anh ta quản lý để thực hiện công việc nếu tập tin đủ nhỏ, nếu không anh ta cắt ngắn tập tin mà không có bất kỳ cảnh báo nào ...
Niavlys

1
FYI Câu hỏi này được gắn thẻ osx và nó không giống như một trong hai lệnh convert-all hoạt động trên Yosemite hoặc El Cap. Phiên bản iconv Táo tàu không hỗ trợ --verbose hoặc -o và cú pháp chuyển hướng cú pháp khác không hoạt động vì một số lý do và chỉ gửi nó đến thiết bị xuất chuẩn thông thường.
Scott McIntyre

28

với powershell bạn có thể làm một cái gì đó như thế này:

%  get-content IN.txt | out-file -encoding ENC -filepath OUT.txt

trong khi ENC là một cái gì đó như unicode, ascii, utf8, utf32. kiểm tra 'trợ giúp ra tập tin'.

để chuyển đổi tất cả các tệp * .txt trong một thư mục thành utf8, hãy làm như thế này:

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

tạo ra một phiên bản được chuyển đổi của mỗi tệp .txt trong DIR2.

EDIT: Để thay thế các tệp trong tất cả các thư mục con sử dụng:

% foreach($i in ls -recurse -filter "*.java") {
    $temp = get-content $i.fullname
    out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}

Chuyển đổi từ ANSI sang UTF thông qua đề xuất đầu tiên của bạn sẽ xóa toàn bộ nội dung của
tệp

@Acroneos: sau đó bạn đã mắc lỗi: tệp trong là IN.txt, tệp ngoài là OUT.txt ... theo cách này không thể ghi đè lên bản gốc. nếu bạn đã sử dụng cùng tên tệp cho IN.txt và OUT.txt thì rõ ràng bạn sẽ ghi đè lên tệp bạn đang đọc.
akira

Powershell sẽ chuyển đổi sang UTF bằng BOM. tìm và iconv có thể dễ dàng hơn nhiều.
pparas

6

Trang Wikipedia trên dòng mới có một phần về tiện ích chuyển đổi .

Điều này có vẻ như đặt cược tốt nhất của bạn cho một chuyển đổi chỉ sử dụng các công cụ Windows có:

TYPE unix_file | FIND "" /V > dos_file

3

UTFCast là một trình chuyển đổi Unicode cho Windows, hỗ trợ chế độ hàng loạt. Tôi đang sử dụng phiên bản trả phí và khá thoải mái với nó.

UTFCast là trình chuyển đổi Unicode cho phép bạn chuyển đổi hàng loạt tất cả các tệp văn bản sang mã hóa UTF chỉ bằng một cú nhấp chuột. Bạn có thể sử dụng nó để chuyển đổi một thư mục chứa đầy các tệp văn bản thành mã hóa UTF bao gồm UTF-8, UTF-16 và UTF-32 sang một thư mục đầu ra, trong khi duy trì cấu trúc thư mục của các tệp gốc. Thậm chí không có vấn đề gì nếu tệp văn bản của bạn có phần mở rộng khác, UTFCast có thể tự động phát hiện tệp văn bản và chuyển đổi chúng.


Có vẻ như họ không thể chuyển đổi vào cùng một thư mục, chỉ vào một thư mục đích khác.
Uwe Keim

Phiên bản pro cho phép chuyển đổi tại chỗ. $ 20/3 tháng. rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman

Ồ, phiên bản express (miễn phí) là vô dụng - nó chỉ "Phát hiện" utf-8 VỚI BOM !! (mọi người đều có thể làm điều đó ). Chỉ phiên bản Pro mà Tự động gia hạn cứ sau 3 tháng ở mức 20 đô la một pop, sẽ tự động phát hiện. Giá là dốc cho một người dùng không phải là doanh nghiệp. VÀ Cẩn thận nếu bạn thử phiên bản cơ bản và tệp của bạn đã là utf-8 (không có BOM), sau đó trình chuyển đổi này sẽ phát hiện nó dưới dạng ASCII, sau đó (tái) "chuyển đổi" thành utf-8, điều này có thể dẫn đến vô nghĩa . Hãy cẩn thận nếu điều này trước khi thử phiên bản express! Họ có phiên bản demo cho bản pro không tạo ra kết quả - IMHO vô nghĩa vì không thể xác minh kết quả trước khi mua!
SherylHohman

3

Oneliner sử dụng find, với tính năng tự động phát hiện

Mã hóa ký tự của tất cả các tệp văn bản phù hợp sẽ được phát hiện tự động và tất cả các tệp văn bản phù hợp được chuyển đổi thành utf-8mã hóa:

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

Để thực hiện các bước này, một lớp vỏ phụ shđược sử dụng với -exec, chạy một lớp lót với -ccờ và chuyển tên tệp làm đối số vị trí "$1"với -- {}. Ở giữa, utf-8tập tin đầu ra được đặt tên tạm thời converted.

Các findlệnh là rất hữu ích cho tự động hóa quản lý tập tin như vậy.

Nhấn vào đây để thêm findgalore .


1

iconv -f original_charset -t utf-8 originalfile > newfile

chạy lệnh trên trong vòng lặp for.





0

Trong trường hợp sử dụng của tôi, tôi cần phát hiện mã hóa đầu vào tự động và có rất nhiều tệp có Windows-1250mã hóa, lệnh nào file -bi <FILE>trả về charset=unknown-8bit. Đây không phải là tham số hợp lệ cho iconv.

Tôi đã có kết quả tốt nhất với enca .

Chuyển đổi tất cả các tệp có phần mở rộng txt thành utf-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;
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.