Pliki do konwersji wsadowej do kodowania

Odpowiedzi:

36

Cygwin lub GnuWin32 zapewniają narzędzia uniksowe, takie jak iconvi 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 .

quack quixote
źródło
4
Nie używaj tej samej nazwy pliku jako danych wejściowych i wyjściowych! iconvwydaje 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
przycina
1
FYI To pytanie jest oznaczone osx i nie wygląda na to, że żadne z poleceń konwersji-wszystkich działa na Yosemite lub El Cap. Wersje iconv Apples Shipty nie obsługują opcji --verbose lub -o, a inna metoda przekierowywania składni stdout nie działa z jakiegoś powodu i po prostu wysyła ją do standardowego stdout.
Scott McIntyre,
28

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
}
akira
źródło
Konwersja ANSI na UTF za pomocą pierwszej propozycji powoduje usunięcie całej zawartości mojego pliku tekstowego ...
Acroneos
@Acroneos: wtedy popełniłeś błąd: plik wejściowy to IN.txt, plik wyjściowy to OUT.txt ... w ten sposób niemożliwe jest zastąpienie oryginału. jeśli użyłeś tej samej nazwy pliku dla IN.txt i OUT.txt, to oczywiście zastąpisz plik, z którego czytasz.
akira,
Powershell przekonwertuje na UTF z BOM. find i iconv mogą być znacznie łatwiejsze.
pparas
6

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
nagul
źródło
3

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.

Dekarz
źródło
Wygląda na to, że nie można ich przekonwertować do tego samego folderu, a jedynie do innego folderu docelowego.
Uwe Keim,
Wersja pro umożliwia konwersję w miejscu. 20 USD / 3 miesiące. rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman
Och, wersja ekspresowa (darmowa) jest bezużyteczna - tylko „wykrywa” utf-8 Z BOM !! (każdy może zrobić to ). Tylko wersja Pro, która automatycznie odnawia się co 3 miesiące po 20 USD za pop, automatycznie wykryje. Cena jest wysoka dla użytkowników spoza przedsiębiorstwa. OSTRZEŻENIE, jeśli wypróbujesz wersję podstawową, a plik ma już utf-8 (bez BOM), to ten konwerter wykryje go jako ASCII, a następnie (ponownie -) „przekonwertuje” go na utf-8, co może spowodować bełkot . Bądź tego świadomy przed wypróbowaniem wersji ekspresowej! Mają wersję demonstracyjną dla pro, która nie generuje żadnych wyników - bezcelowe IMHO, ponieważ nie może zweryfikować wyników przed zakupem!
SherylHohman
3

Oneliner używa find, z automatycznym wykrywaniem

Kodowanie znaków wszystkich pasujących plików tekstowych jest wykrywane automatycznie, a wszystkie pasujące pliki tekstowe są konwertowane na utf-8kodowanie:

$ 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 shjest używany -exec, prowadzenie jedną wkładkę z -cflagą i przepuszczenie pliku jako argumentu położenia "$1"z -- {}. W międzyczasie utf-8plik wyjściowy ma tymczasową nazwę converted.

findKomenda jest bardzo użyteczna dla takiej automatyzacji zarządzania plikami.

Kliknij tutaj, aby uzyskać więcej findobfitości .

Serge Stroobandt
źródło
1

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

uruchom powyższe polecenie w pętli for.

Aneesh Garg
źródło
0

Możesz użyć EncodingMaster . Jest bezpłatny, ma wersję Windows, Linux i Mac OS X i działa naprawdę dobrze.

Francisco Vera
źródło
1
Wspomniana strona internetowa jest zamknięta.
Etienne Delavennat
0

W moim przypadku użycia potrzebowałem automatycznego wykrywania kodowania wejściowego i było wiele plików z Windows-1250kodowaniem, 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' -- {} \;
Bedla
źródło