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?
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:
Cygwin hoặc GnuWin32 cung cấp các công cụ Unix như iconv
và dos2unix
(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 .
iconv
dườ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 ...
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
}
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
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.
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-8
mã 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 -c
cờ và chuyển tên tệp làm đối số vị trí "$1"
với -- {}
. Ở giữa, utf-8
tập tin đầu ra được đặt tên tạm thời converted
.
Các find
lệ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 find
galore .
iconv -f original_charset -t utf-8 originalfile > newfile
chạy lệnh trên trong vòng lặp for.
Sử dụng tập lệnh Python này: https://github.com/goerz/convert_encoding.py Nó hoạt động trên mọi nền tảng. Yêu cầu Python 2.7.
Có dos2unix
trên unix.
Có một công cụ tương tự cho Windows ( một ref khác ở đây ).
Làm cách nào để chuyển đổi giữa các tệp văn bản Unix và Windows? có thêm một số mánh khóe
dos2unix
là hữu ích để chuyển đổi ngắt dòng , nhưng OP đang tìm cách chuyển đổi mã hóa ký tự.
Bạn có thể sử dụng EncodingMaster . Nó miễn phí, nó có phiên bản Windows, Linux và Mac OS X và hoạt động rất tốt.
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-1250
mã 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' -- {} \;