nachdem ich immer mehr UTF8 Textdateien habe, da ich diese gleichermaßen von PC und Mac verwende und es mit der Kodierung immer Ärger gibt, habe ich ein Programm gesucht, das mir rekursiv in einem Verzeichnis alle Textdateien von Windows 1252 (Latin1-Derivat) in UTF-8 umwandelt.
Pustekuchen, nichts einschlägiges gefunden außer das beschränkte Programm "EncodingMaster", das nicht viel kann.
Also habe ich mit Cygwin ein winziges Shellskript geschrieben, das mir das erledigt. Die zwischen Windows und Cygwin vermittelnde Batchvorlage ist von Duncans Smart Weblog, Executing Cygwin Bash scripts on Windows (vielen Dank Duncan!).
Zuerst muss also Cygwin installiert sein und dort auch das Programm "recode", das muss man nachinstallieren.
Dann habe ich ein Skript utf8.cmd (das ramsche ich in das Total Commander Verzeichnis):
Code: Select all
@echo off
:: 2016-03-10: von: http://blog.dotsmart.net/2011/01/27/executing-cygwin-bash-scripts-on-windows/
setlocal
if not exist "%~dpn0.sh" echo Script "%~dpn0.sh" not found & exit 2
set _CYGBIN=c:\cygwin64\bin\
if not exist "%_CYGBIN%" echo Couldn't find Cygwin at "%_CYGBIN%" & exit 3
:: Resolve ___.sh to /cygdrive based *nix path and store in %_CYGSCRIPT%
for /f "delims=" %%A in ('%_CYGBIN%\cygpath.exe "%~dpn0.sh"') do set _CYGSCRIPT=%%A
:: Throw away temporary env vars and invoke script, passing any args that were passed to us
endlocal & %_CYGBIN%\bash --login "%_CYGSCRIPT%" %*
PAUSE
Der PAUSE Befehl dient dazu, Fehler im cmd Fenster anzuzeigen, falls vorhanden. Tastendruck schließt damit das cmd.
Mein Shellskript heißt dann auch utf8.sh (muss genauso heißen mit Vornamen):
Code: Select all
#!/bin/sh
# 2016-03-10: von: http://blog.dotsmart.net/2011/01/27/executing-cygwin-bash-scripts-on-windows/
path="$1"
# zum Testen entsprechend entkommentieren:
# path=c:\\Temp\\utf8\\test.txt
# path=c:\\Temp\\utf8\\
# und auf der Kommandozeile die utf8.cmd ausfuehren
echo "path: $path"
unixpath=$(sed -e 's#^\(\w\):#/cygdrive/\1#' -e 's#\\#/#g' <<< "$path")
echo "unixpath: $unixpath"
if [[ $unixpath =~ /$ ]]
then
# echo "dir"
echo "Alle Textdateien (.txt) des Verzeichisses $unixpath und aller Unterverzeichnisse von windows-1252 in utf-8 umwandeln..."
echo ""
find "$unixpath" -name "*.txt" -exec recode windows-1252..utf-8 {} \;
else
# echo "file"
echo "Nur $unixpath von windows-1252 in utf-8 umwandeln..."
echo ""
recode windows-1252..utf-8 "$unixpath"
fi
Klickt man auf den Button wird jede txt-Datei im Verzeichnis und darunter von win1252 in utf8 umgewandelt, ob es eine ist oder nicht.
Will man die Verknüpfung nur auf einzelne Dateien anwenden, legt man als Parameter statt den Pfad (%P) auch den Dateiname (%N), also %P%N an. Das Skript unterscheidet, ob eine Datei oder ein Verzeichnis übergeben wurde.
Allerdings kann es nicht feststellen, ob eine Datei bereits utf8 ist, in dem Fall wird es wieder unleserlich (die Umlaute). Dann müsste man mit einem anderen Skript noch mal drüber, wo statt windows-1252..utf-8 dann jeweils utf-8..windows-1252 steht.
Ich bin mir fast sicher, dass es etwas einfacheres bereits längst gibt und ich mir den Nachmittag damit hätte sparen können, aber es bringt ja auch Übung

franc