Holen Sie sich die Codierung einer Datei in Windows

206

Dies ist eigentlich keine Programmierfrage. Gibt es eine Befehlszeile oder ein Windows-Tool (Windows 7), um die aktuelle Codierung einer Textdatei abzurufen? Sicher kann ich eine kleine C # -App schreiben, aber ich wollte wissen, ob bereits etwas eingebaut ist?

TheWebGuy
quelle
12
Die Codierung einer Datei in Windows sollte der Titel sein. Wenn Sie es nicht im Voraus wissen, werden Sie nie sicher raten können.
Tom Blodget

Antworten:

222

Öffnen Sie Ihre Datei mit dem normalen alten Vanille-Editor, der mit Windows geliefert wird.
Es zeigt Ihnen die Codierung der Datei, wenn Sie auf " Speichern unter ... " klicken .
Es wird so aussehen: Geben Sie hier die Bildbeschreibung ein

Unabhängig von der standardmäßig ausgewählten Codierung ist dies Ihre aktuelle Codierung für die Datei.
Wenn es sich um UTF-8 handelt, können Sie es in ANSI ändern und auf Speichern klicken, um die Codierung zu ändern (oder umgekehrt).

Mir ist klar, dass es viele verschiedene Arten der Codierung gibt, aber das war alles, was ich brauchte, als ich informiert wurde, dass unsere Exportdateien in UTF-8 waren und ANSI erforderlich waren. Es war ein einmaliger Export, also war Notepad genau das Richtige für mich.

Zu Ihrer Information: Nach meinem Verständnis ist " Unicode " (wie im Editor aufgeführt) eine falsche Bezeichnung für UTF-16.
Mehr hier auf Notepads " Unicode " -Option: Windows 7 - UTF-8 und Unicdoe

MikeTeeVee
quelle
1
@ Alex, ich benutze Win-8 nicht. Bei einer Google-Suche habe ich diesen Link gefunden: Win-8 Notepad . Ich hoffe du findest es, weil ich dir versichere, es ist immer noch da.
MikeTeeVee
1
Danke, aber unter Windows 8.1 gibt es definitiv keine App namens Notepad. Wenn Sie den Editor in die Suche eingeben, wird "Editor" angezeigt. Und dies hat nicht diese endodierende Dropdown-Liste und auch kein Menü dafür
Alex
4
Diese Methode funktioniert nicht für Dateien, die zu groß sind, als dass der Editor sie öffnen könnte. Und diese Grenze wird viel schneller erreicht als bei anderen Editoren wie Notepad ++. Mein Windows 8.1 hat Notepad. Vielleicht in% windir% \ system32 \ notepad.exe suchen?
Fabian Kessler
3
Notepad existiert in Windows 8 und Windows 10.
Alan B
6
Notepad ist in ALLEN Windows-Versionen mindestens seit Windows 3 installiert.
Jean-François Larvoire
64

Das (Linux-) Befehlszeilentool 'file' ist unter Windows über GnuWin32 verfügbar:

http://gnuwin32.sourceforge.net/packages/file.htm

Wenn Sie git installiert haben, befindet es sich in C: \ Programme \ git \ usr \ bin.

Beispiel:

    C: \ Benutzer \ SH \ Downloads \ SquareRoot> Datei *
    _UpgradeReport_Files; Verzeichnis
    Debuggen; Verzeichnis
    Dauer.h; ASCII C ++ - Programmtext mit CRLF-Zeilenabschlüssen
    ipch; Verzeichnis
    main.cpp; ASCII C-Programmtext mit CRLF-Zeilenabschlüssen
    Precision.txt; ASCII-Text mit CRLF-Zeilenabschlüssen
    Freisetzung; Verzeichnis
    Speed.txt; ASCII-Text mit CRLF-Zeilenabschlüssen
    SquareRoot.sdf; Daten
    SquareRoot.sln; UTF-8-Unicode-Text (mit Stückliste) mit CRLF-Zeilenabschlusszeichen
    SquareRoot.sln.docstates.suo; PCX ver. 2.5 Bilddaten
    SquareRoot.suo; CDF V2-Dokument, beschädigt: Zusammenfassungsinformationen können nicht gelesen werden
    SquareRoot.vcproj; XML-Dokumenttext
    SquareRoot.vcxproj; XML-Dokumenttext
    SquareRoot.vcxproj.filters; XML-Dokumenttext
    SquareRoot.vcxproj.user; XML-Dokumenttext
    squarerootmethods.h; ASCII C-Programmtext mit CRLF-Zeilenabschlüssen
    UpgradeLog.XML; XML-Dokumenttext

    C: \ Benutzer \ SH \ Downloads \ SquareRoot> Datei - Mime-Codierung *
    _UpgradeReport_Files; binär
    Debuggen; binär
    Dauer.h; us-ascii
    ipch; binär
    main.cpp; us-ascii
    Precision.txt; us-ascii
    Freisetzung; binär
    Speed.txt; us-ascii
    SquareRoot.sdf; binär
    SquareRoot.sln; utf-8
    SquareRoot.sln.docstates.suo; binär
    SquareRoot.suo; CDF V2-Dokument, beschädigt: Infobinäre Zusammenfassung kann nicht gelesen werden
    SquareRoot.vcproj; us-ascii
    SquareRoot.vcxproj; utf-8
    SquareRoot.vcxproj.filters; utf-8
    SquareRoot.vcxproj.user; utf-8
    squarerootmethods.h; us-ascii
    UpgradeLog.XML; us-ascii
Sybren
quelle
1
Beachten Sie, dass Sie wahrscheinlich Git 2.x dafür benötigen, ich habe es nicht mit Git 1.9.5
Jakub.g
Für meine Datei steht "binär" :(
barbara.post
1
Es ist unglaublich, dass man für die Grundbedienung zur Befehlszeile zurückkehren muss. Dies ist 2017, aber es scheint in Ordnung zu sein.
Todd Partridge
1
Wie die andere Antwort schon sagt, können Sie den fileBefehl auch in cygwin verwenden . Jedes POSIX-Toolset für Windows sollte haben file.
Palswim
Wenn Sie git für Windows installiert haben, enthält es GIT BASH (Bash-Emulator), der wiederum den Befehl 'file' enthält. Ich habe es gerade benutzt und es funktioniert. Es wird auch in der nächsten Antwort erwähnt ...
Amir Katz
61

Wenn Sie "git" oder "Cygwin" auf Ihrem Windows-Computer haben, wechseln Sie in den Ordner, in dem sich Ihre Datei befindet, und führen Sie den folgenden Befehl aus:

file *

Dadurch erhalten Sie die Codierungsdetails aller Dateien in diesem Ordner.

George Ninan
quelle
Hinzufügen zu Ihrer Antwort: Wenn Sie nur an einer bestimmten Datei interessiert sind, können Sie den Befehl grep verwenden , um die Ergebnisse des file *Befehls zu filtern
ebram khalil
Anstatt nur file --mime-encodingden
Dateibefehl blind auszuführen
23

Ein weiteres Tool, das ich nützlich fand: https://archive.codeplex.com/?p=encodingchecker EXE finden Sie hier

user961954
quelle
4
Wirklich hilfreich, um mehrere Dateien zu analysieren
Eric Bonnot
1
Sofortige Antwort auch bei sehr großen Dateien (wie zu erwarten).
Fabian Kessler
1
Funktioniert unter Windows 10.
barbara.post
2
Ich kann nicht herausfinden, wo sich die exe-Datei auf dieser Seite befindet. Ist der Link veraltet?
Christoph
1
@ MarkDeven Ich habe Pfad zu exe in Antwort hinzugefügt
user961954
17

Hier ist meine Vorgehensweise zum Erkennen der Unicode-Familie von Textcodierungen über Stücklisten. Die Genauigkeit dieser Methode ist gering, da diese Methode nur für Textdateien (insbesondere Unicode-Dateien) funktioniert und standardmäßig asciikeine Stückliste enthält (wie bei den meisten Texteditoren ist die Standardeinstellung, UTF8wenn Sie mit dem HTTP / Web-Ökosystem übereinstimmen möchten ).

Update 2018 : Ich empfehle diese Methode nicht mehr. Ich empfehle die Verwendung von file.exe aus GIT- oder * nix-Tools, wie von @Sybren empfohlen, und ich zeige in einer späteren Antwort, wie dies über PowerShell funktioniert .

# from https://gist.github.com/zommarin/1480974
function Get-FileEncoding($Path) {
    $bytes = [byte[]](Get-Content $Path -Encoding byte -ReadCount 4 -TotalCount 4)

    if(!$bytes) { return 'utf8' }

    switch -regex ('{0:x2}{1:x2}{2:x2}{3:x2}' -f $bytes[0],$bytes[1],$bytes[2],$bytes[3]) {
        '^efbbbf'   { return 'utf8' }
        '^2b2f76'   { return 'utf7' }
        '^fffe'     { return 'unicode' }
        '^feff'     { return 'bigendianunicode' }
        '^0000feff' { return 'utf32' }
        default     { return 'ascii' }
    }
}

dir ~\Documents\WindowsPowershell -File | 
    select Name,@{Name='Encoding';Expression={Get-FileEncoding $_.FullName}} | 
    ft -AutoSize

Empfehlung: Das kann recht gut funktionieren , wenn die dir, lsoder Get-ChildItemnur überprüft bekannten Textdateien, und wenn Sie nur für „schlechte Codierungen“ aus einer bekannten Liste von Tool suchen. (dh SQL Management Studio verwendet standardmäßig UTF16, wodurch GIT auto-cr-lf für Windows unterbrochen wurde, was für viele Jahre der Standard war.)

Yzorg
quelle
Get-FileEncodingscheint auf meinem System nicht zu existieren. Ist es ein benutzerdefiniertes Cmdlet?
Xavier Poinas
Es gibt viele Variationen von Get-FileEncodingPoshcode. Ich habe sogar Punycode von Python und NodeJS überprüft, aber diese kleine Version erreicht 80/20 für meine Verwendung (eher 99/1). Wenn Sie Dateien anderer Personen hosten, empfehlen wir Ihnen, den fileBefehl aus Sybens Antwort ( stackoverflow.com/a/34766140/195755 ) oder einen anderen Unicode-Decoder in Produktionsqualität zu verwenden.
Yzorg
Es sollte hinzugefügt werden, dass diese Methode nur funktioniert, wenn die Stückliste vorhanden ist ... was nicht immer der Fall ist
Yepeekai
@Yepeekai Die letzte Zeile wird defaultcodiert (wenn keine Stückliste vorhanden ist). Für XML, JSON und JavaScript ist der Standardwert UTF8, Ihr Kilometerstand kann jedoch variieren.
Yzorg
@yzorg: aber das ist ein hirntoter Weg, es zu tun. Du lügst nur den Benutzer an. Zumindest die meisten Parser machen eine fundierte Vermutung. Wenn Sie keine Vermutung anstellen können, geben Sie einfach einen Fehler aus und teilen Sie ihnen mit, dass eine Stückliste erforderlich ist, um Ihren Code zu verwenden (und verwenden Sie dann ein anderes, intelligenteres Tool, da bereits viele vorhanden sind).
Ed S.
7

Ich habe die Antwort Nr. 4 geschrieben (zum Zeitpunkt des Schreibens). Aber in letzter Zeit habe ich Git auf allen meinen Computern installiert, also verwende ich jetzt die Lösung von @ Sybren. Hier ist eine neue Antwort, die diese Lösung von Powershell aus praktisch macht (ohne git / usr / bin in den PATH zu setzen, was für mich zu viel Unordnung ist).

Fügen Sie dies zu Ihrem hinzu profile.ps1:

$global:gitbin = 'C:\Program Files\Git\usr\bin'
Set-Alias file.exe $gitbin\file.exe

Und verwendet wie : file.exe --mime-encoding *. Sie müssen .exe in den Befehl aufnehmen, damit der PS-Alias ​​funktioniert.

Wenn Sie Ihr PowerShell-Profil jedoch nicht anpassen.ps1, empfehlen wir Ihnen, mit meinem zu beginnen: https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 und speichern Sie es unter ~\Documents\WindowsPowerShell. Es ist sicher auf einem Computer ohne Git zu verwenden, schreibt jedoch Warnungen, wenn Git nicht gefunden wird.

Die .exe im Befehl ist auch, wie ich C:\WINDOWS\system32\where.exevon Powershell benutze; und viele andere OS CLI-Befehle, die von Powershell "standardmäßig ausgeblendet" werden, * Achselzucken *.

Yzorg
quelle
1
oder Sie könnten einfach fileals Alias ​​für file.exe anstelle von file.exe¯ \ _ (ツ) _ / ¯
ferrell_io
@ferrell_io TL; DR: PS basiert auf .NET und .NET hat die statische Klasse "Datei", und PS hat genug verwirrende Überladungen mit allgemeinen EXE-Dateien, sodass ich .exe verwende, um PS von Win EXE: dir | where Size -lt 10000vs. zu unterscheiden where.exe git.
Yzorg
@ferrell_io Ich benutze es where.exe, um es von wherePS zu unterscheiden , das ein eingebauter Alias ​​für ist Where-Object. Beispiel: where.exe git* vs ls . | where Size -lt 10000
yzorg
@ferrell_io Ich verwende also dasselbe Muster für die file.exestatische Klasse vs .NET, das Sie möglicherweise in demselben Skript benötigen, das die Codierung erkennt. Beispiel : [File]::SetCreationTime("readme.md", [DateTime]::Now).
Yzorg
6

Eine einfache Lösung könnte darin bestehen, die Datei in Firefox zu öffnen.

  1. Ziehen Sie die Datei per Drag & Drop in Firefox
  2. Klicken Sie mit der rechten Maustaste auf die Seite
  3. Wählen Sie "Seiteninformationen anzeigen"

und die Textcodierung wird im Fenster "Seiteninfo" angezeigt.

Geben Sie hier die Bildbeschreibung ein

Hinweis: Wenn die Datei nicht im TXT-Format vorliegt, benennen Sie sie einfach in TXT um und versuchen Sie es erneut.

PS Weitere Informationen finden Sie in diesem Artikel.

Nur Schatten
quelle
4

Installieren Sie git (unter Windows müssen Sie die git bash console verwenden). Art:

file *   

für alle Dateien im aktuellen Verzeichnis oder

file */*   

für die Dateien in allen Unterverzeichnissen

phd_coder
quelle
2

Ähnlich wie bei der oben mit Notepad aufgeführten Lösung können Sie die Datei auch in Visual Studio öffnen, wenn Sie diese verwenden. In Visual Studio können Sie "Datei> Erweiterte Speicheroptionen ..." auswählen.

Das Kombinationsfeld "Codierung:" gibt an, welche Codierung derzeit für die Datei verwendet wird. Dort sind viel mehr Textcodierungen aufgeführt als in Notepad. Daher ist es nützlich, wenn Sie mit verschiedenen Dateien aus der ganzen Welt und was auch immer arbeiten.

Genau wie bei Notepad können Sie auch die Codierung aus der Liste der dortigen Optionen ändern und die Datei dann speichern, nachdem Sie auf "OK" geklickt haben. Sie können die gewünschte Codierung auch über die Option "Mit Codierung speichern ..." im Dialogfeld "Speichern unter" auswählen (indem Sie auf den Pfeil neben der Schaltfläche "Speichern" klicken).

JaykeBird
quelle
Schön, aber wenn ich versuche, die Datei mit Visual Studio zu öffnen, wird die Datei immer im zugehörigen Texteditor geöffnet (Notepad ++ für diese Art von Dateierweiterung).
barbara.post
@ barbara.post Das würde etwas mit Ihren Visual Studio-Einstellungen zu tun haben, denke ich. Ich konnte in Visual Studio auf alle Nur-Text-Dateien aller Art zugreifen. Sie haben es wahrscheinlich angewiesen, einfach zu Notepad ++ zu wechseln, wenn eine Datei mit dieser Erweiterung gefunden wird. Das sind zumindest meine Gedanken.
JaykeBird
2

Hier finden Sie einen C-Code für die zuverlässige Erkennung von ASCII, Bom's und Utf8: https://unicodebook.readthedocs.io/guess_encoding.html

Nur ASCII, UTF-8 und Codierungen unter Verwendung einer Stückliste (UTF-7 mit Stückliste, UTF-8 mit Stückliste, UTF-16 und UTF-32) verfügen über zuverlässige Algorithmen, um die Codierung eines Dokuments zu erhalten. Für alle anderen Codierungen müssen Sie Heuristiken vertrauen, die auf Statistiken basieren.

BEARBEITEN:

Eine Powershell-Version einer C # -Antwort von: Effektiver Weg, um die Codierung einer Datei zu finden . Funktioniert nur mit Signaturen (Boms).

# get-encoding.ps1
param([Parameter(ValueFromPipeline=$True)] $filename)    
begin {
  # set .net current directoy                                                                                                   
  [Environment]::CurrentDirectory = (pwd).path
}
process {
  $reader = [System.IO.StreamReader]::new($filename, 
    [System.Text.Encoding]::default,$true)
  $peek = $reader.Peek()
  $encoding = $reader.currentencoding
  $reader.close()
  [pscustomobject]@{Name=split-path $filename -leaf
                BodyName=$encoding.BodyName
                EncodingName=$encoding.EncodingName}
}


.\get-encoding chinese8.txt

Name         BodyName EncodingName
----         -------- ------------
chinese8.txt utf-8    Unicode (UTF-8)


get-childitem -file | .\get-encoding
js2010
quelle
1
@jeasoft Danke. Ich habe einen Fix hinzugefügt, um das aktuelle .net-Verzeichnis festzulegen. stackoverflow.com/questions/11246068/…
js2010
1

Der einzige Weg, den ich gefunden habe, um dies zu tun, ist VIM oder Notepad ++.

Todd Partridge
quelle
2
Leider sind sie keine "eingebauten" Werkzeuge
phuclv