Umlaute in Textdateien unter Mac und Windows - zu utf8 umwandeln

F

francwalter

Aktives Mitglied
Thread Starter
Dabei seit
25.04.2008
Beiträge
950
Reaktionspunkte
39
Hallo
ich nutze ein SVN-Repository in Windows 10 und Mac 10.15.7 gleichermaßen. Leider habe ich einige alte Textdateien, die ich unter früheren Windowsversionen wohl nicht mit utf8-Kodierung erstellt hatte. Öffne ich diese im Mac (zB mit BBEdit oder auch TextEdit) lese ich zB solche Sachen:
...zusätzliche Sendebox, die WFHD, wo man die Geräte anschließt ...
Oder:
...länger gültig...
Die Datei ist vermutlich mal als ISO 8859-15 (oder CP1252) kodiert worden und mein Mac öffnet sie als UTF-8.
Allerdings sollte es bei solchen Zeichen ja anders rum sein, sie wären als utf8 kodiert und der Mac interpretierte sie als ISO 8859-1, lese ich bei UTF-8 und die seltsamen Zeichen.
Dann gäbe es solche Ergebnisse, sonst eher nur so ein komischer Fragezeichen-Platzhalter (�), wo der Umlaut steht.

Ich habe auf Windows zwar längst auf UTF-8 umgestellt, bzw. ist es bei W10 oft schon Standard in den Texteditoren (bzw. habe ich sie so eingestellt), aber hin und wieder treffe ich auf solche alten verkorksten Dateien und dann fange ich an im Mac mit Suchen und Ersetzen die Zeichen zu korrigieren, das nervt natürlich.

Gibt es zB mit iconv einen Befehl, mit dem ich solche Textdateien auf dem Mac korrigiere?
Also zB der Befehl (mit der Textdatei text.txt) funktioniert nicht:
Bash:
iconv -f iso-8859-1 -t utf-8 < test.txt > test.new.txt
Das macht aus
länger gültig
in test.new.txt leider nur:
länger gültig
Irgendwas habe ich da noch nicht richtig verstanden.
Auf dem PC habe ich mal so eine Batch gebastelt, die mir das umwandelt und das funktioniert auch, aber auf dem Mac fehlt mir so was noch...

Danke für Tipps.
franc

EDIT: jetzt habe ich zum Spaß mal umgedreht, also von utf8 (-f oder --from-code) nach iso-8859-1 (-t oder --to-code) wandeln :
Bash:
iconv -t iso-8859-1 -f utf-8 < test.txt > test.new.txt
und siehe da es geht!
Also sind die Dateien als utf8 gespeichert, damit es aber richtig angezeigt wird, müssen sie zu iso-8859 umgewandelt werden, um dann mit utf8 geöffnet zu werden.
Alles sehr verwirrend :(
 
Zuletzt bearbeitet:
Unicode hat auch Mehrbyte Zeichen.
Du kennst die Funktion von BBEdit unten im Fenster die Kodierung umzuschalten?
 
  • Gefällt mir
Reaktionen: dg2rbf
Unicode hat auch Mehrbyte Zeichen.
Du kennst die Funktion von BBEdit unten im Fenster die Kodierung umzuschalten?
Ja, aber das ändert nichts. Mit BBedit geht es glaube ich nicht. Unter Windows ging es mit EditPad Pro schon, aber das war auch umständlich.
Das Skript (Batchdatei) das ich dann genommen hatte, ging einfacher.
 
Zuletzt bearbeitet:
Stelle ein: "Unicode™ (UTF-8, no BOM)"
 
  • Gefällt mir
Reaktionen: dg2rbf
Die Datei ist vermutlich mal als ISO 8859-15 (oder CP1252) kodiert worden und mein Mac öffnet sie als UTF-8.
Eigentlich ist es genau andersrum und der Bösewicht ist wohl dein SVN-Repository.

Die einzelnen Zeichen in den Dateien sind in UTF-8, dem File als Ganzen fehlt aber die BOM-Markierung als Unicode-Datei.

Dein SVN-Repository spuckt die Dateien anscheinend als ASCII/Latin-1 aus. Wie und warum das so ist, kann ich nicht sagen.
Der Mac glaubt das unbesehen und zeigt die Multibyte-UTF8-Zeichen fälschlich als Singlebyte-Latin-1 an.

Damit die Datei richtig angezeigt wird, muss man
entweder
(a)- am Anfang der Datei den BOM hinzufügen
oder
(b)- jedes einzelne Zeichen von UTF8 nach Latin-1 zurückwandeln

Mit iconv machst du -im zweiten Versuch- anscheinend (b)
Das wäre OK, solange es nur um ÄÖÜäöüß geht.
Wenn da aber Unicode-Zeichen außerhalb des Windows-1252-Zeichenvorrats drin sind, gehen die Dateien dabei mglw. kaputt.
 
  • Gefällt mir
Reaktionen: francwalter
Da muss man wohl mal die Text Datei im Hexeditor angucken, was genau da jetzt für Zeichenmischmasch drin ist.
 
  • Gefällt mir
Reaktionen: francwalter
Ich hab jetzt mal auf dem PC geschaut, wie ich das dort gemacht hatte: mit Cygwin und recode:
Code:
recode windows-1252..utf-8
Genauer gesagt habe ich mit einem Skript von Executing Cygwin Bash scripts on Windows den Dateipfad an die Cygwin Bash (c:\cygwin64\bin\bash) übergeben und damit ein Skript ausgeführt, mit find und recode.
Im Total Commander habe ich dazu ein Icon in der Toolbar, die den kompletten Pfad einer markierten Datei als Parameter für folgendes Skript aufruft:

utf8.cmd:
Bash:
@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
und das ruft dann utf8.sh auf, das enthält:
Bash:
#!/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
 
Zurück
Oben Unten