Làm thế nào để đổi tên tập tin thành mã hóa khác nhau?


8

Tôi có 3 loại file namemã hóa trên reiserfsổ cứng được gắn: CP1251, KOI-8, UTF-8 và ASCII. Tôi thực sự cần phải chuyển đổi tất cả các bảng mã sang UTF-8, theo cách đệ quy. Có tiện ích nào, sẽ phát hiện mã hóa nguồn và chuyển đổi nó thành UTF-8 hoặc tôi phải viết tập lệnh Python?


Trong trường hợp chung, không thể tự động "đoán" mã hóa tên (ví dụ: hầu hết các chuỗi byte là tên tệp KOI-8 và CP1251 (nhưng khác). Bạn có thêm manh mối nào để biết mã hóa tên không?

Không có manh mối nào khác :(
Pablo

Bạn có tên tập tin chữ thường và chữ hoa không?

Có, tôi có cả tên tệp chữ thường và (tất cả) tên chữ hoa.
Pablo

Bất cứ ai có nhu cầu? Kiểm tra detox. Nó hoạt động với tôi giữa ISO-8859-1 và UTF-8 bằng cách sử dụng-s iso8859_1-only
Alwin Kesler

Câu trả lời:


12

Sử dụng convmv, một công cụ CLI để chuyển đổi tên tệp giữa các bảng mã khác nhau. Để chuyển đổi từ ( -f) các điều khoản này sang ( -t) UTF-8, hãy làm như sau:

convmv -f CP1251 -t UTF-8 inputfile
convmv -f KOI-8  -t UTF-8 inputfile
convmv -f ASCII  -t UTF-8 inputfile

Ngoài ra, nếu bạn muốn chuyển đổi nội dung tệp, hãy sử dụng iconvcông cụ CLI để chuyển đổi nội dung tệp thành các bảng mã khác nhau. Để chuyển đổi từ ( -f) các điều khoản này sang ( -t) UTF-8, hãy làm như sau:

iconv -f CP1251 -t UTF-8 inputfile > outputfile
iconv -f KOI-8  -t UTF-8 inputfile > outputfile
iconv -f ASCII  -t UTF-8 inputfile > outputfile

1
Đây không phải là nội dung tệp mà tôi cần chuyển đổi, mà chính là tên tệp
Pablo

Được chứ. Bạn đã thử đối thủ chưa?
Marcos Roriz Junior

ASCII đã là một tập hợp con của UTF-8 nên không cần phải chuyển đổi.
psusi

1

Không. Một trong những nhược điểm lớn của hệ thống trang mã cũ là không có cách nào để phát hiện cái nào đang được sử dụng; bạn chỉ cần biết rằng một tiên nghiệm. Nếu bạn biết tập tin nào đang sử dụng mã hóa nào thì bạn có thể chuyển đổi tên bằng cách sử dụng cái gì đó như:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`

Quá nhiều tệp để đổi tên thủ công ... Tôi nghĩ rằng các bộ mã có phạm vi mã ký tự riêng biệt.
Pablo

@Pablo, không, đó là toàn bộ vấn đề: với một byte 8 bit, bạn chỉ có 256 mã ký tự có thể. Sau khi trừ bộ ký tự ASCII thông thường và mã điều khiển còn lại 128 mã cho các mã bổ sung, không đủ để thể hiện toàn bộ phạm vi ký tự trong tất cả các ngôn ngữ. Mỗi trang mã sử dụng riêng 128 mã phía trên để thể hiện các ký tự quan trọng đối với người dùng. Cách duy nhất để tìm ra cái nào đang được sử dụng là thử hiển thị từng trang mã có thể và xem tên đó có xuất hiện hay không và đó không phải là thứ mà máy tính quyết định.
psusi

tốt, con trăn chardetbằng cách nào đó đang phát hiện ra nó ...
Pablo

@Pablo, gọn gàng ... có vẻ như nó đưa ra một phỏng đoán có giáo dục dựa trên sự phổ biến của các nhân vật khác nhau trong ngôn ngữ viết. Nói cách khác, nó giả định rằng một số ký tự nhất định, như glyphs ngớ ngẩn ít phổ biến hơn nói, 'a' có dấu, và cố gắng diễn giải các ký tự trong mỗi trang mã và tìm ra một mã có nhiều mã phù hợp nhất với các ký tự phổ biến hơn. Mặc dù có vẻ như nó không chính xác lắm, đặc biệt là với một số lượng nhỏ ký tự, chẳng hạn như tên tệp.
psusi

0

Giải pháp tương tự với iconv@psusi sugeses nhưng với loop và while-card:

Ngoài ra shkịch bản shell oneline :

for f in /path/*.txt; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done

Với việc đọc thẻ trong từ đường ống:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; 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.