marric
Goto Top

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.

Content-Key: 295126

Url: https://administrator.de/contentid/295126

Printed on: April 19, 2024 at 20:04 o'clock

Member: Lochkartenstanzer
Lochkartenstanzer Feb 04, 2016 updated at 11:14:54 (UTC)
Goto Top
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
Member: beidermachtvongreyscull
beidermachtvongreyscull Feb 04, 2016 updated at 11:26:03 (UTC)
Goto Top
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
Member: Lochkartenstanzer
Lochkartenstanzer Feb 04, 2016 at 11:28:57 (UTC)
Goto Top
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.

Nur leider ist der oft nicht da, obwohl die datei UTF-8-codiert ist. face-sad

Um es mathematisch zu sagen: BOM ist hinreichend, aber nicht notwendig.

lks
Member: MarRic
MarRic Feb 04, 2016 at 12:36:56 (UTC)
Goto Top
Danke schon mal, theoretisch ist die Bytesequenz EF BB entscheident; meine Theorie wäre das BF nur den BOM definiert, also BF [mit] und FF [ohne]. Alles andere wäre also kein UTF-8. Bedeutet also das ich mir irgendwie die erste Bytesequenz ausgeben lassen muss.

Alternativ könnte ich mir auch vorstellen die Daten pro forma in UTF-8 zu konvertieren. Dadurch sollte m.E. kein expliziter Nachteil enstehen.
Member: MarRic
MarRic Feb 04, 2016 at 13:20:03 (UTC)
Goto Top
Ich habe jetzt ein Powershell Cmdlet gefunden, mit dem sich schon mal die Codierung auslesen lässt.

Cmdlet: FileEncoding

Funktioniert auch soweit, bis auf den Punkt, dass UTF-8 ohne BOM als ASCII interpretiert wird.

Mal schauen ob ich damit weiterkomme.
Member: rubberman
rubberman Feb 04, 2016 updated at 18:50:10 (UTC)
Goto Top
Hallo.

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
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
Member: Lochkartenstanzer
Lochkartenstanzer Feb 04, 2016 updated at 19:14:50 (UTC)
Goto Top
Zitat von @rubberman:

Eine Datei ohne BOM als UTF-8 zu identifizieren ist schwieriger ...

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
Member: rubberman
rubberman Feb 04, 2016 at 21:42:25 (UTC)
Goto Top
Hallo lks.

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 face-wink

Grüße
rubberman
Member: MarRic
MarRic Feb 08, 2016 at 10:16:43 (UTC)
Goto Top
Hallo zusammen,

ich danke euch schon mal. Ich hätte nicht gedacht, dass sich das zu einem derartigen Problem entwickelt. face-sad

Vermutlich komme ich schneller zum Ziel, wenn ich knallhart das Encoding, sofern ASCII erkannt wird, zu UTF-8 ändere. Theoretisch sollten daraus keine Nachteile resultieren.

VG
Member: bauinformatiker
bauinformatiker Oct 01, 2019 at 10:46:40 (UTC)
Goto Top
Mir fehlt hier das Unix-Commando "file", für das es auch Windows-Portierungen gibt. Das erkennt auch UTF8 sehr gut.