Codierung einer Textdatei ermitteln
Hallo zusammen,
ich stehe aktuell vor folgender Herausforderung: Von einem Kunde bekomme ich jeden Tag CSV-Dateien geliefert, die von einem Automatismus verarbeiten werden.
Vor Projektbeginn hatten wir uns auf bestimmte Parameter geeinigt u.a. auf die Verwendung der Zeichencodierung UTF-8. In der Regel werden diese Daten kundenseitig auch korrekt geliefert, allerdings kann es durchaus vorkommen, dass die Daten nicht im UTF-8- sondern ANSI-Format übertragen werden. Resultierend daraus entfallen zuweilen Sonderzeichen.
Um den daraus resultierenden Fehlern möglichst frühzeitig entgegenwirken zu können suche ich nach einer Möglichkeit die Zeichencodierung schon im Vorfeld zu ermitteln.
Der ganze Prozess wird über ein ein Batch gesteuert. Gibt es einer Möglichkeit diese Codierungs-Abfrage optimalerweise über das Batch optional über die Powershell zu erzeugen?
Viele Grüße und Dank im Voraus.
ich stehe aktuell vor folgender Herausforderung: Von einem Kunde bekomme ich jeden Tag CSV-Dateien geliefert, die von einem Automatismus verarbeiten werden.
Vor Projektbeginn hatten wir uns auf bestimmte Parameter geeinigt u.a. auf die Verwendung der Zeichencodierung UTF-8. In der Regel werden diese Daten kundenseitig auch korrekt geliefert, allerdings kann es durchaus vorkommen, dass die Daten nicht im UTF-8- sondern ANSI-Format übertragen werden. Resultierend daraus entfallen zuweilen Sonderzeichen.
Um den daraus resultierenden Fehlern möglichst frühzeitig entgegenwirken zu können suche ich nach einer Möglichkeit die Zeichencodierung schon im Vorfeld zu ermitteln.
Der ganze Prozess wird über ein ein Batch gesteuert. Gibt es einer Möglichkeit diese Codierungs-Abfrage optimalerweise über das Batch optional über die Powershell zu erzeugen?
Viele Grüße und Dank im Voraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 295126
Url: https://administrator.de/forum/codierung-einer-textdatei-ermitteln-295126.html
Ausgedruckt am: 25.04.2025 um 11:04 Uhr
10 Kommentare
Neuester Kommentar
Moin,
leider ist das nicht so einfach, wie man sich das vorstellen köntne,. Wenn man nicht explizit weiß, welche Zeichen in den Dateien nicht vorkommen dürfen aber in der anderen datei vorkommen, kann man nicht unbeding feststellen, ob eine Datei ANSi oder UTF-8 kodiert ist.
Wenn es nur um die Umlaute geht, würde ich einfach nach diesen in einer bestimmten Codierung suchen und falls diese gefunden wird, den Dateityp als diesen annehmen.
lks
leider ist das nicht so einfach, wie man sich das vorstellen köntne,. Wenn man nicht explizit weiß, welche Zeichen in den Dateien nicht vorkommen dürfen aber in der anderen datei vorkommen, kann man nicht unbeding feststellen, ob eine Datei ANSi oder UTF-8 kodiert ist.
Wenn es nur um die Umlaute geht, würde ich einfach nach diesen in einer bestimmten Codierung suchen und falls diese gefunden wird, den Dateityp als diesen annehmen.
lks
Was Du tun kannst:
Ist die Datei eine UTF-8-Datei oder nicht?
Dazu musst Du den BOM in der Datei suchen. Der steht im Offset 00000000 Byte 00 - 02: EF BB BF
Der zeigt Dir, dass es sich um eine UTF-8-codierte Datei handelt.
Steht an diesem Offset aber etwas anderes, so muss es keine UTF-8-Datei sein.
Nicht UTF-8-Dateien enthalten normalerweise (so kenne ich es zumindest) keinen Eintrag oder Marker über die verwendete Codierung.
Ich fürchte, da hilft dann nur ein Schlüsselwort, das nur in einer Codierung korrekt ausgelesen werden kann und dann abgeprüft wird.
Weiteres zu Codierung:
CodeSnipers
Ist die Datei eine UTF-8-Datei oder nicht?
Dazu musst Du den BOM in der Datei suchen. Der steht im Offset 00000000 Byte 00 - 02: EF BB BF
Der zeigt Dir, dass es sich um eine UTF-8-codierte Datei handelt.
Steht an diesem Offset aber etwas anderes, so muss es keine UTF-8-Datei sein.
Nicht UTF-8-Dateien enthalten normalerweise (so kenne ich es zumindest) keinen Eintrag oder Marker über die verwendete Codierung.
Ich fürchte, da hilft dann nur ein Schlüsselwort, das nur in einer Codierung korrekt ausgelesen werden kann und dann abgeprüft wird.
Weiteres zu Codierung:
CodeSnipers
Zitat von @beidermachtvongreyscull:
Dazu musst Du den BOM in der Datei suchen. Der steht im Offset 00000000 Byte 00 - 02: EF BB BF
Der zeigt Dir, dass es sich um eine UTF-8-codierte Datei handelt.
Dazu musst Du den BOM in der Datei suchen. Der steht im Offset 00000000 Byte 00 - 02: EF BB BF
Der zeigt Dir, dass es sich um eine UTF-8-codierte Datei handelt.
Nur leider ist der oft nicht da, obwohl die datei UTF-8-codiert ist.
Um es mathematisch zu sagen: BOM ist hinreichend, aber nicht notwendig.
lks
Hallo.
Eine Datei ohne BOM als UTF-8 zu identifizieren ist schwieriger und nur dann überhaupt möglich, wenn auch tatsächlich Zeichen vorkommen, die > ASCII 127 sind.
Grüße
rubberman
optimalerweise über das Batch
@echo off &setlocal
set "file=test.csv"
setlocal &<nul >"%temp%\fc.txt~" set /p "=###"
for /f "skip=1 tokens=1,2 delims=: " %%i in ('fc /b "%file%" "%temp%\fc.txt~" ^&del "%temp%\fc.txt~"') do set "b%%i=%%j"
endlocal &set "bom=%b00000000%%b00000001%%b00000002%"
if "%bom%"=="EFBBBF" (
echo UTF-8 mit BOM.
) else if "%bom:~,4%"=="FFFE" (
echo UTF-16 LE mit BOM.
) else (
echo Andere Kodierung.
)
pause
Grüße
rubberman
Wie ich schon sagte, kommt das durchaus öfter vor als es einem lieb sein kann.
.. und nur dann überhaupt möglich, wenn auch tatsächlich Zeichen vorkommen, die > ASCII 127 sind.
Wenn alle Zeichen einen Code <128 haben, ist das Problem unerheblich, weil das einfach nur Standard-ASCII ist, egal in welcher Codierung. Von daher ist es egal, ob man die Datei als ANSI oder UTF interpretiert.
Und bei zeichen über 127 muß man schon genau wissen, welche Zeichen überhaupt in der Eingabe vorkommen können und daraus dann Rückschlüsse auf die Codierung ziehen zu können.
lks
Hallo lks.

Grüße
rubberman
Wenn alle Zeichen einen Code <128 haben, ist das Problem unerheblich, weil das einfach nur Standard-ASCII ist, egal in welcher Codierung.
Schon klar.Und bei zeichen über 127 muß man schon genau wissen, welche Zeichen überhaupt in der Eingabe vorkommen können
Nein. Man muss lediglich prüfen, ob der Text Zeichen enthält, die für UTF-8 ungültig sind. Die Regeln sind relativ simpel. Wenn ich mich anstrenge, bekomme ich das sogar mit Batch umgesetzt. Mit FC /B und ein bisschen Workaround lässt sich ein Hexdump der Datei erzeugen und mit bitweisen Operationen lassen sich dann auch die Bytes gemäß den Regeln für UTF-8 prüfen. Aber, hey, warum sollte man so etwas mit Batch machen? Die Laufzeiten wären jenseits von gut und böse. Da überlasse ich den PowerShell Scriptern das Feld, wenn das schon als alternative Sprache gewünscht ist Grüße
rubberman