W jaki sposób mogę konwertować pliki w katalogu do ich kodowania (np. ANSI-> UTF-8) za pomocą polecenia lub narzędzia?
W przypadku pojedynczych plików pomaga edytor, ale jak wykonać masową pracę z plikami?
W jaki sposób mogę konwertować pliki w katalogu do ich kodowania (np. ANSI-> UTF-8) za pomocą polecenia lub narzędzia?
W przypadku pojedynczych plików pomaga edytor, ale jak wykonać masową pracę z plikami?
Odpowiedzi:
Cygwin lub GnuWin32 zapewniają narzędzia uniksowe, takie jak iconv
i dos2unix
(i unix2dos
). W systemach Unix / Linux / Cygwin będziesz chciał użyć „Windows-1252” jako kodowania zamiast ANSI (patrz poniżej). (O ile nie wiesz, że twój system używa strony kodowej innej niż 1252 jako domyślnej strony kodowej, w takim przypadku musisz powiedzieć iconv właściwej stronie kodowej, z której chcesz tłumaczyć.)
Konwertuj z jednej ( -f
) na drugą ( -t
) za pomocą:
$ iconv -f windows-1252 -t utf-8 infile > outfile
Lub w formie „znajdź i podbij”:
## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;
Alternatywnie:
## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;
To pytanie było zadawane wiele razy na tej stronie, więc oto dodatkowe informacje na temat „ANSI”. W odpowiedzi na powiązane pytanie CesarB wspomina :
Istnieje kilka kodowań, które w systemie Windows nazywane są „ANSI”. W rzeczywistości ANSI jest mylące . iconv nie ma możliwości zgadnięcia, które chcesz.
Kodowanie ANSI to kodowanie używane przez funkcje „A” w interfejsie API systemu Windows (funkcje „W” używają UTF-16). To, które kodowanie odpowiada, zwykle zależy od języka systemu Windows. Najczęstszym jest CP 1252 (znany również jako Windows-1252). Tak więc, gdy twój edytor mówi ANSI, oznacza to „cokolwiek funkcje API wykorzystują jako domyślne kodowanie ANSI”, które jest domyślnym kodowaniem innym niż Unicode używanym w twoim systemie (a więc zwykle tym, które jest używane dla plików tekstowych).
Strona, do której prowadzi, podaje ten historyczny smakołyk (cytowany z Microsoft PDF ) na temat pochodzenia CP 1252 i ISO-8859-1, innego często używanego kodowania:
[...] wynika to z faktu, że strona kodowa Windows 1252 była pierwotnie oparta na szkicu ANSI, który stał się normą ISO 8859-1. Jednak dodając punkty kodowe do zakresu zarezerwowanego dla kodów kontrolnych w standardzie ISO, strona kodowa Windows 1252 i kolejne strony kodowe Windows pierwotnie oparte na serii ISO 8859-x odbiegały od ISO. Do dziś często zdarza się, że społeczność programistów, zarówno w firmie Microsoft, jak i poza nią, myli stronę kodową 8859-1 z Windows 1252, a także widzi „ANSI” lub „A” używane do oznaczania obsługi strony kodowej Windows .
iconv
wydaje się obcinać pliki do 32 768 bajtów, jeśli przekraczają ten rozmiar. Gdy pisze w pliku, z którego próbuje odczytać, udaje mu się wykonać zadanie, jeśli plik jest wystarczająco mały, w przeciwnym razie
w PowerShell możesz zrobić coś takiego:
% get-content IN.txt | out-file -encoding ENC -filepath OUT.txt
podczas gdy ENC jest czymś w rodzaju Unicode, ascii, utf8, utf32. kasa „plik pomocy”.
aby przekonwertować wszystkie pliki * .txt w katalogu na utf8, wykonaj coś takiego:
% foreach($i in ls -name DIR/*.txt) { \
get-content DIR/$i | \
out-file -encoding utf8 -filepath DIR2/$i \
}
który tworzy przekonwertowaną wersję każdego pliku .txt w DIR2.
EDYCJA: Aby zastąpić pliki we wszystkich podkatalogach, użyj:
% foreach($i in ls -recurse -filter "*.java") {
$temp = get-content $i.fullname
out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}
Strona Wikipedii na temat nowych linii zawiera sekcję dotyczącą narzędzi do konwersji .
To wydaje się być najlepszym rozwiązaniem do konwersji przy użyciu tylko narzędzi dostarczanych z systemem Windows:
TYPE unix_file | FIND "" /V > dos_file
UTFCast to konwerter Unicode dla Windows, który obsługuje tryb wsadowy. Korzystam z wersji płatnej i czuję się z nią komfortowo.
UTFCast to konwerter Unicode, który umożliwia grupową konwersję wszystkich plików tekstowych na kodowanie UTF jednym kliknięciem myszy. Można go użyć do konwersji katalogu pełnego plików tekstowych na kodowanie UTF, w tym UTF-8, UTF-16 i UTF-32, do katalogu wyjściowego, zachowując jednocześnie strukturę katalogów oryginalnych plików. Nie ma nawet znaczenia, czy plik tekstowy ma inne rozszerzenie, UTFCast może automatycznie wykryć pliki tekstowe i przekonwertować je.
Kodowanie znaków wszystkich pasujących plików tekstowych jest wykrywane automatycznie, a wszystkie pasujące pliki tekstowe są konwertowane na utf-8
kodowanie:
$ 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"' -- {} \;
W celu przeprowadzenia tych etapów podpowłoki sh
jest używany -exec
, prowadzenie jedną wkładkę z -c
flagą i przepuszczenie pliku jako argumentu położenia "$1"
z -- {}
. W międzyczasie utf-8
plik wyjściowy ma tymczasową nazwę converted
.
find
Komenda jest bardzo użyteczna dla takiej automatyzacji zarządzania plikami.
Kliknij tutaj, aby uzyskać więcej find
obfitości .
iconv -f original_charset -t utf-8 originalfile > newfile
uruchom powyższe polecenie w pętli for.
Użyj tego skryptu Python: https://github.com/goerz/convert_encoding.py Działa na dowolnej platformie. Wymaga Python 2.7.
Jest dos2unix
na Uniksie.
Było inne podobne narzędzie dla Windows ( tutaj można znaleźć inne odniesienie ).
Jak konwertować między plikami tekstowymi Unix i Windows? ma więcej sztuczek
dos2unix
jest użyteczny do konwersji podziałów linii , ale OP szuka konwersji kodowania znaków.
Możesz użyć EncodingMaster . Jest bezpłatny, ma wersję Windows, Linux i Mac OS X i działa naprawdę dobrze.
W moim przypadku użycia potrzebowałem automatycznego wykrywania kodowania wejściowego i było wiele plików z Windows-1250
kodowaniem, dla których komenda file -bi <FILE>
zwraca charset=unknown-8bit
. To nie jest poprawny parametr dla iconv
.
Z enca miałem najlepsze wyniki .
Konwertuj wszystkie pliki z rozszerzeniem txt na utf-8
find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;