Win-1252 Textdateien in UTF-8 umwandeln (mit Cygwin)

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Win-1252 Textdateien in UTF-8 umwandeln (mit Cygwin)

Post by *franc »

Hallo
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
Das bin Verzeichnis ist bei mir dort: c:\cygwin64\bin\ und muss im Batchskript angepasst werden (also in der utf8.cmd).
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
Schließlich habe ich eine Verknüpfung auf utf8.cmd in der Toolbar gelegt mit dem Parameter %P (also der Pfad).
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
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Post by *franc »

Leider verkorkst mir das Skript die Berechtigungen, wenn ich in einem völlig freigegebenen (Jeder darf alles) Verzeichnis bin, ich weiß nicht warum.

So sollte es aussehen:
http://abload.de/img/clipboard-hp8600eksa9.jpg
und so sieht das danach aus:
http://abload.de/img/clipboard-gq8600i6s6q.jpg
http://abload.de/img/clipboard-uh86009xstp.jpg
http://abload.de/img/clipboard-em8600x7slr.jpg

Bin auf Windows 8.1 (64). Weiß da jemand was?
User avatar
milo1012
Power Member
Power Member
Posts: 1158
Joined: 2012-02-02, 19:23 UTC

Post by *milo1012 »

Ich bin zwar kein Unix-/Linux-Experte, aber Google ist eigentlich immer dein Freund.
So fand ich ziemlich schnell das hier:
http://mindspill.net/computing/linux-notes/determine-and-change-file-character-encoding/
Kann sein dass das in cygwin nicht so ganz kompatibel funktioniert.

Und außerdem
*Hust*
Mal was von iconv gehört?
https://en.wikipedia.org/wiki/Iconv
*Hust*
Sollte in Cygwin schon vorhanden sein.
Da braucht man recode nicht nachträglich.

Auch ich bin mir sicher, dass ein fertiges (Bash-)Skript da draußen gibt,
oder jemand eine fertige Lösung ohne Cygwin parat hat.
Ob es eine gute Idee ist, Cygwin aus TC heraus anzusprechen, ist nämlich eine andere Sache.
TC plugins: PCREsearch and RegXtract
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Post by *franc »

Ja, mit iconv hab ich zuerst rumexperimentiert, aber recode ist einfacher.

Aber was ist bloß mit den Berechtigungen passiert?
User avatar
milo1012
Power Member
Power Member
Posts: 1158
Joined: 2012-02-02, 19:23 UTC

Post by *milo1012 »

Keine Ahnung wegen der Berechtigungen.
Vermutlich ist da Cygwin nicht so ganz sauber installiert, denn normalerweise sollten die Berechtigungen transparent umgeleitet werden.
Aber: muss cygwin nicht erst selbst über ein Initilisierungsskript gestartet werden?
Ist mir neu dass man cygpath.exe bzw. bash einfach so starten kann, ohne die richtige Umgebung einzustellen.
TC plugins: PCREsearch and RegXtract
User avatar
Dalai
Power Member
Power Member
Posts: 9970
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Das ist bekannt und betrifft alle Cygwin-basierten Programme. Ich hab das vor einigen Wochen (wieder einmal) bei cwRsync bemerkt und dann nach längerer Suche endlich beheben können: Permissions on files/directories are cluttered/mixed up

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Post by *franc »

milo1012 wrote:...Aber: muss cygwin nicht erst selbst über ein Initilisierungsskript gestartet werden?
Ist mir neu dass man cygpath.exe bzw. bash einfach so starten kann, ohne die richtige Umgebung einzustellen.
Aber das wird doch über das Batch (utf8.cmd) gestartet.
Wie soll man das initialisieren?
Ich hab jetzt mal noch ein paar Einträge in die /etc/fstab getan, gemäß der Anleitung, jetzt scheints zu gehen :)
Also das in die /etc/fstab:

Code: Select all

C:/cygwin64/bin   /usr/bin    ntfs        binary,auto,noacl           0   0
C:/cygwin64/lib   /usr/lib    ntfs        binary,auto,noacl           0   0
C:/cygwin64       /           ntfs        override,binary,auto,noacl  0   0
none            /cygdrive   cygdrive    binary,posix=0,user,noacl   0   0
Ich hatte schon etwas rumgesucht und mir die Lösungen angeschaut, aber bisher habe ich echt kein auch praktisch anwendbares Programm gefunden. Das "beste" war ja noch dieses "EncodingMaster" und das ist nicht besonders.
Ich glaube für Windows gibt es kein praktikables Programm, das mir auch in einem Rutsch alles umwandelt, ohne dass ich hinterher einen Wust an "Sicherheitsbackups" habe, was man nie abstellen kann.
Ich hatte übrigens auch mit Google gesucht und dann aber die Ergebnisse auch geprüft, also die Links geöffnet, nicht nur die Links angeschaut.
User avatar
milo1012
Power Member
Power Member
Posts: 1158
Joined: 2012-02-02, 19:23 UTC

Post by *milo1012 »

franc wrote:Aber das wird doch über das Batch (utf8.cmd) gestartet.
Wie soll man das initialisieren?
Das war nur eine erste Vermutung, denn bei einer älteren Installation wurden bei mir immer zwecks Cross-Compiler einige Startskripte abgefahren,
weswegen ich nie auf die Idee gekommen wäre, die Binaries direkt aufzurufen.
Aber du hast die Ursache ja offenbar gefunden.
franc wrote:Ich glaube für Windows gibt es kein praktikables Programm, das mir auch in einem Rutsch alles umwandelt, ohne dass ich hinterher einen Wust an "Sicherheitsbackups" habe, was man nie abstellen kann.
Was auch ehrlich gesagt gut so ist, denn sind die Daten erst mal weg, dann bleiben sie auch weg.
Ich könnte dir auch eine Möglichkeit nennen, wie du mit einem meiner TC-Plugins halbwegs bequem alles in UTF-8 umwandeln kannst,
aber eben halt auch nur unter erzeugen neuer Dateien, und behalten aller alten.
TC plugins: PCREsearch and RegXtract
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Post by *franc »

Ich hab halt eine Menge alter unter Windows angelegter Windows-1252 kodierter Dateien in meinem mittlerweile mit Mac gemeinsam genutzten SVN Repository.
Ich habe in meinem Editor (EditPad Pro) Textdateien daher auf UTF8 umgestellt.
Jedes Mal wenn ich nun auf so eine verkorkste Textdatei stoße, muss ich einige Male klicken um das umzukodieren. Daher finde ich es schon praktisch, das auf Knopfdruck rekursiv abzufahren. Ein Klick und alles ist umgewandelt.
Falls ich merken sollte, dass da was versaubeutelt ist, dann halt Zack! wird die vorige Version aus dem Repository wieder hergestellt. Keine Gefahr des Datenverlusts also.
Außerhalb dieser Repositorys ist mir Windows1252 auf dem Windows Rechner egal.
milo1012 wrote:...Ich könnte dir auch eine Möglichkeit nennen, wie du mit einem meiner TC-Plugins halbwegs bequem alles in UTF-8 umwandeln kannst,
aber eben halt auch nur unter erzeugen neuer Dateien, und behalten aller alten.
Was heißt "halbwegs bequem"? Und man kann da nicht einstellen, dass die Dateien direkt überschrieben werden?
User avatar
milo1012
Power Member
Power Member
Posts: 1158
Joined: 2012-02-02, 19:23 UTC

Post by *milo1012 »

franc wrote:Falls ich merken sollte, dass da was versaubeutelt ist, dann halt Zack! wird die vorige Version aus dem Repository wieder hergestellt. Keine Gefahr des Datenverlusts also.
Das mag für deine Datenhaltung in Ordnung sein, aber ein allgemein gehaltenes Programm kann nicht davon ausgehen, dass ein Backup vorhanden ist,
und sollte deshalb vor dem Überschreiben/Manipulieren der Datei mindestens nachfragen.
Das selbe würde ich auch machen, wenn ich so ein Programm schreiben würde.
Und eben deshalb ist es schwierig, so ein Programm ohne Sicherheitsmechanismen zu finden,
vor allem weil intern ja sowieso mit eine Backupdatei gearbeitet werden muss, da ich die Eingangsdaten i.d.R. nicht direkt wieder
umkodiert zurückschreiben kann (es sei denn, man benutzt riesige Puffer im RAM).
franc wrote:Was heißt "halbwegs bequem"? Und man kann da nicht einstellen, dass die Dateien direkt überschrieben werden?
Nein.
Bequem heißt für mich: vom TC direkt bedienbar, indem es sich ins Packer-Interface einklinkt.
Demzufolge kann ich die Eingangdatei auch nicht sich selbst als Archiv überschreiben lassen.


Ich meine mein RegXtract-Plug-in
Einstellungen z.B.:
Standardeinstellungen, also .* und $0
und lediglich Dotall (?s) aktivieren.

Jetzt alle Dateien im TC sammeln und markieren.
Jetzt Strg halten während man auf den Dateien-Packen-Button geht.

Im Dialog
"Erzeuge separate Archive, eines pro gewählte Datei"
aktivieren
und
"Beim Packen von Ordnern das Basisverzeichnis weglassen"
deaktivieren.

Jetzt würde für jede Eingangsdatei input.txt eine Ausgangsdatei input.txt.txt im selben Ort der Eingangdatei erzeugt, die nach UTF-8 umkodiert wurde.
Dateien die schon UTF-8 oder UTF-16 sind werden in 99% der Fälle erkannt und entsprechend behandelt.
Die Ausgangsdatei wird in jedem Fall UTF-8 (bei Standardoptionen).

Die Maske kann natürlich entsprechend angepasst werden, z.B.
regxtract:*.*.utf8.regxtract


Du kannst mein PCREsearch-Plug-in nehmen, um festzustellen, ob eine Datei schon UTF-8 ist.
EncInfo kann das auch, schießt aber manchmal übers Ziel hinaus.
TC plugins: PCREsearch and RegXtract
mofi
Junior Member
Junior Member
Posts: 15
Joined: 2007-01-28, 10:13 UTC
Location: Vienna

Post by *mofi »

franc, möglicherweise wäre Texteditor UltraEdit mit dem UltraEdit Skript Convert files to UTF-8 eine interessante Alternative. Bitte die Anwendungshinweise im Kommentarblock am Beginn des Skripts beachten.

Vor der Verwendung von UltraEdit mit diesem Skript für das Konvertieren aller Dateien in einer Verzeichnisstruktur empfehle ich in der UltraEdit Konfiguration das Erstellen von Backupdateien zu deaktivieren und stattdessen eine Sicherungskopie der gesamten Verzeichnisstruktur zu erstellen.
Regards from Austria!
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

PowerShell ASCII Win-1252 in UTF-8 umwandeln

Post by *Stefan2 »

BTW: mofi ist ein "Mitarbeiter" von IDM, der Firma hinter UltraEdit.

franc wrote:...habe ich ein Programm gesucht,
das mir rekursiv in einem Verzeichnis alle Textdateien
von Windows 1252 (Latin1-Derivat) in UTF-8 umwandelt.
Probier's mal mit PowerShell:


Hier ohne Nachfrage, ohne Fehlerbehandlung, ohne Backups:
Die originalen Dateien werden überschrieben! Kümmere dich selbst vorher um ein Backup.
ACHTUNG: wenn etwas schief läuft, zB falsches Encoding gewählt, dann sind die Dateien unter Umständen nur noch 0 byte groß.
Also >> Backup vorher, oder das im Skript erledigen lassen.


Offizielle Schreibweise (zB für eine Skriptdatei)
[face=timesnewroman]Get-ChildItem -Recurse -Filter *.txt | ForEach{ $File=$_.FullName; $Cont=Get-Content $File; Set-Content -Path $File -Value $Cont -Encoding utf8 }[/face]



Das Selbe, Schritt-für-Schritt Ansicht:
Get-ChildItem -Recurse -Filter *.txt |
ForEach{
    $File=$_.FullName;
    $Cont=Get-Content $File;
    Set-Content -Path $File -Value $Cont -Encoding utf8
}





Das Selbe, in Kurzform (Aliase und Abkürzungen, für die Kommandozeile:
LS -re -fi *.txt|%{$F=$_.FullName;$C=gc $F;sc $F $C -enc utf8}

Und noch kürzer:
(LS -re -fi *.txt).FullName|%{sc $_ (gc $_) -enc utf8}



Skript mit eingebautem Backup:
LS -re -fi *.txt|%{$F=$_.FullName;Copy $F "$F.orig.txt";IF(Test-Path "$F.orig.txt"){$C=gc $F;sc $F $C -enc utf8}}
Man kann ja leicht nach "*.orig.txt" suchen und diese Backups nachträglich wieder löschen.




HTH? (Meiner Einer ist kein Mitarbeiter von Microsoft :lol: )


-------------- EDIT
franc wrote:Allerdings kann es nicht feststellen, ob eine Datei bereits utf8 ist, in dem Fall wird es wieder unleserlich (die Umlaute).

Für diesen Fall müsste man wohl dieses Funktion in die obige Befehlszeile einbauen.

Dazu könnte man diesen Code als Datei speichern und "dot sourcen".



http://poshcode.org/2059

Code: Select all

<#
.SYNOPSIS
Gets file encoding.
.DESCRIPTION
The Get-FileEncoding function determines encoding by looking at Byte Order Mark (BOM).
Based on port of C# code from http://www.west-wind.com/Weblog/posts/197245.aspx
.EXAMPLE
Get-ChildItem  *.ps1 | select FullName, @{n='Encoding';e={Get-FileEncoding $_.FullName}} | where {$_.Encoding -ne 'ASCII'}
This command gets ps1 files in current directory where encoding is not ASCII
.EXAMPLE
Get-ChildItem  *.ps1 | select FullName, @{n='Encoding';e={Get-FileEncoding $_.FullName}} | where {$_.Encoding -ne 'ASCII'} | foreach {(get-content $_.FullName) | set-content $_.FullName -Encoding ASCII}
Same as previous example but fixes encoding using set-content
#>
function Get-FileEncoding
{
    [CmdletBinding()] Param (
     [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName = $True)] [string]$Path
    )

    [byte[]]$byte = get-content -Encoding byte -ReadCount 4 -TotalCount 4 -Path $Path

    if ( $byte[0] -eq 0xef -and $byte[1] -eq 0xbb -and $byte[2] -eq 0xbf )
    { Write-Output 'UTF8' }
    elseif ($byte[0] -eq 0xfe -and $byte[1] -eq 0xff)
    { Write-Output 'Unicode' }
    elseif ($byte[0] -eq 0 -and $byte[1] -eq 0 -and $byte[2] -eq 0xfe -and $byte[3] -eq 0xff)
    { Write-Output 'UTF32' }
    elseif ($byte[0] -eq 0x2b -and $byte[1] -eq 0x2f -and $byte[2] -eq 0x76)
    { Write-Output 'UTF7'}
    else
    { Write-Output 'ASCII' }
}



 
Last edited by Stefan2 on 2016-04-04, 14:05 UTC, edited 1 time in total.
franc
Senior Member
Senior Member
Posts: 263
Joined: 2005-10-27, 14:09 UTC

Post by *franc »

Danke, das werde ich bei Gelegenheit mal testen, aber bisher geht das Cygwin Skript (s.o.) in Verbindung mit dem fstab Eintrag (s.a.o.) ganz gut, keine Klagen.
Da ich das sowieso nur im SVN brauche, weil nur da kommt sich mein Windows PC mit meinem Mac in die Quere, ist auch keinerlei Gefahr der fehlenden Backups, kann es ja jederzeit wieder zurückholen, falls es versaubeutelt wurde durch den Skript.

UltraEdit hatte ich früher mal genommen, es gab da mal eine kostenlose Vollversion. Fand ich ganz gut, aber dann hab ich mir doch lieber EditPadPro gekauft (immerhin was mit 30.-!!!) der ist doch deutlich besser und mächtiger als das uralte UltraEdit.
Nein, ich bin kein "Mitarbeiter" von EditPadPro, aber der Editor ist trotzdem super :)
Gruß franc
mofi
Junior Member
Junior Member
Posts: 15
Joined: 2007-01-28, 10:13 UTC
Location: Vienna

Post by *mofi »

Ich bin kein "Mitarbeiter" von IDM Computer Solutions, Inc., Hersteller des Texteditors UltraEdit. Ich bekomme zumindest keinen Cent für die Betreuung der UltraEdit Anwenderforen als Moderator.

Ich wollte hier nur eine alternative Lösung zum Konvertieren von Dateien von Windows 1252 auf UTF-8 anbieten. Diese kostet auch nichts, weil UltraEdit kann man 30 Tage lang testen. Und zum Konvertieren der Dateien mittels des UltraEdit Skripts braucht man nur ein paar Minuten, dann kann man UltraEdit ja wieder deinstallieren, sogar inklusive der anwenderspezifischen Konfigurationsdateien erstellt von UltraEdit beim ersten Start.

UltraEdit ist mittlerweile schon mehr als 20 Jahre alt, aber die aktuellen Versionen brauchen den Vergleich mit anderen Texteditoren wirklich nicht zu scheuen. Allerdings kann ich da nicht aus eigener Erfahrung sprechen, denn ich verwende keine anderen Texteditoren, da ich mit UltraEdit wirklich alle Textbearbeitungen durchführen kann.

Total Commander, UltraEdit, WinRAR und IrfanView sind die Programme, die ich zu 95% meiner Computerarbeitszeit einsetze. Total Commander ist dabei mein Windows Desktop. (Der Windows Desktop selbst ist eine schwarze Fläche.) Alle Programme werden entweder über TC oder über ein Windows Tastenkürzel (Verknüpfungseigenschaft) gestartet.
Regards from Austria!
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Danke für die Klarstellung, mofi.

Ich habe dich mit leo verwechselt. Der ist inzwischen beim Betreiber eines anderen Forums eingestellt worden.





 
Post Reply