Ottieni la codifica di un file in Windows


206

Questa non è davvero una domanda di programmazione, esiste una riga di comando o uno strumento di Windows (Windows 7) per ottenere la codifica corrente di un file di testo? Sicuro di poter scrivere una piccola app C # ma volevo sapere se c'è qualcosa di già incorporato?


12
Indovina la codifica di un file in Windows è come dovrebbe essere il titolo. Se non lo sai in anticipo, non sarai mai in grado di indovinare per certo.
Tom Blodget l'

Risposte:


222

Apri il tuo file usando il normale vecchio Blocco note vaniglia fornito con Windows.
Ti mostrerà la codifica del file quando fai clic su " Salva con nome ... ".
Sarà simile a questo: inserisci qui la descrizione dell'immagine

Qualunque sia la codifica selezionata per impostazione predefinita, questa è la codifica corrente per il file.
Se è UTF-8, puoi cambiarlo in ANSI e fare clic su Salva per cambiare la codifica (o viceversa).

Mi rendo conto che ci sono molti diversi tipi di codifica, ma questo era tutto ciò di cui avevo bisogno quando mi è stato comunicato che i nostri file di esportazione erano in UTF-8 e richiedevano ANSI. È stata un'esportazione occasionale, quindi il Blocco note era adatto a me.

FYI: Secondo la mia comprensione, penso che " Unicode " (come elencato nel Blocco note) sia un termine improprio per UTF-16.
Maggiori informazioni sull'opzione " Unicode " di Blocco note : Windows 7 - UTF-8 e Unicdoe


1
@Alex, non uso Win-8. Eseguendo una ricerca su Google, ho trovato questo link: Win-8 Notepad . Spero che lo trovi perché ti assicuro che è ancora lì.
MikeTeeVee,

1
Grazie ma su Windows 8.1 non esiste sicuramente un'app chiamata Blocco note. Quando si inserisce il blocco note nella ricerca, viene visualizzato "editor". E questo non ha quel menu a discesa di endoding e nemmeno un menu per questo
Alex

4
Questo metodo non funziona per file troppo grandi per l'apertura di Blocco note. E quel limite è raggiunto molto più velocemente di altri editor come Notepad ++. Il mio Windows 8.1 ha Notepad. Cerca in% windir% \ system32 \ notepad.exe forse?
Fabian Kessler il

3
Blocco note esiste in Windows 8 e Windows 10.
Alan B,

6
Blocco note è installato in TUTTE le versioni di Windows almeno da Windows 3.
Jean-François Larvoire,

64

Lo strumento da riga di comando (Linux) 'file' è disponibile su Windows tramite GnuWin32:

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

Se hai installato git, si trova in C: \ Programmi \ git \ usr \ bin.

Esempio:

    C: \ Users \ SH \ Download \ SquareRoot> file *
    _UpgradeReport_Files; elenco
    debug; elenco
    duration.h; Testo del programma ASC ++ C ++, con terminatori di riga CRLF
    IPCH; elenco
    main.cpp; Testo del programma ASCII C, con terminatori di riga CRLF
    Precision.txt; Testo ASCII, con terminatori di riga CRLF
    Pubblicazione; elenco
    Speed.txt; Testo ASCII, con terminatori di riga CRLF
    SquareRoot.sdf; dati
    SquareRoot.sln; Testo Unicode UTF-8 (con distinta materiali), con terminatori di riga CRLF
    SquareRoot.sln.docstates.suo; PCX ver. 2.5 dati immagine
    SquareRoot.suo; Documento CDF V2, corrotto: impossibile leggere le informazioni di riepilogo
    SquareRoot.vcproj; Testo del documento XML
    SquareRoot.vcxproj; Testo del documento XML
    SquareRoot.vcxproj.filters; Testo del documento XML
    SquareRoot.vcxproj.user; Testo del documento XML
    squarerootmethods.h; Testo del programma ASCII C, con terminatori di riga CRLF
    UpgradeLog.XML; Testo del documento XML

    C: \ Users \ SH \ Download \ SquareRoot> file --mime-encoding *
    _UpgradeReport_Files; binario
    debug; binario
    duration.h; US-ASCII
    IPCH; binario
    main.cpp; US-ASCII
    Precision.txt; US-ASCII
    Pubblicazione; binario
    Speed.txt; US-ASCII
    SquareRoot.sdf; binario
    SquareRoot.sln; utf-8
    SquareRoot.sln.docstates.suo; binario
    SquareRoot.suo; Documento CDF V2, corrotto: impossibile leggere il riepilogo infobinary
    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

1
nota che probabilmente hai bisogno di git 2.x per questo, non ce l'ho con git 1.9.5
jakub.g

Per il mio file dice "binario" :(
barbara.post il

1
Incredibile dover tornare alla riga di comando per le operazioni di base, questo è il 2017, ma sembra funzionare bene.
Todd Partridge,

1
Come dice l'altra risposta , puoi anche usare il filecomando in cygwin . Qualsiasi set di strumenti POSIX per Windows dovrebbe avere file.
palswim,

Se hai installato git per Windows, include GIT BASH (emulatore bash), che a sua volta include il comando 'file'. L'ho appena usato e funziona. Viene menzionato anche nella prossima risposta ...
Amir Katz,

61

Se hai "git" o "Cygwin" sul tuo computer Windows, vai alla cartella in cui è presente il tuo file ed esegui il comando:

file *

Questo ti darà i dettagli di codifica di tutti i file in quella cartella.


aggiungendo alla tua risposta, se ti interessa solo un file specifico, puoi usare il comando grep per filtrare i risultati del file *comando
ebram khalil

Invece di eseguire semplicemente il comando file alla cieca, il comando completo che risponde a questa domanda è file --mime-encodingottenere la codifica per il file
smac89

23

Un altro strumento che ho trovato utile: https://archive.codeplex.com/?p=encodingchecker EXE può essere trovato qui


4
Davvero utile per analizzare più file
Eric Bonnot

1
Risposta immediata anche con file molto grandi (come ci si aspetterebbe).
Fabian Kessler il

1
Funziona con l'attuale Windows 10.
barbara.post,

2
non riesco a capire dove sia il file exe su quella pagina. Il link è obsoleto?
Christoph,

1
@MarkDeven Ho aggiunto il percorso a exe in risposta
user961954

17

Ecco la mia opinione su come rilevare la famiglia di codifiche di testo Unicode tramite DBA. L'accuratezza di questo metodo è bassa, poiché questo metodo funziona solo su file di testo (in particolare file Unicode) e viene impostato automaticamente asciiquando non è presente alcuna DBA (come la maggior parte degli editor di testo, l'impostazione predefinita sarebbe UTF8se si desidera abbinare l'ecosistema HTTP / Web ).

Aggiornamento 2018 : non consiglio più questo metodo. Consiglio di utilizzare file.exe da GIT o gli strumenti * nix come raccomandato da @Sybren e in una risposta successiva mostrerò come farlo tramite PowerShell .

# 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

Raccomandazione: Questo può funzionare ragionevolmente bene se i dir, lso Get-ChildItemsolo i controlli noti i file di testo, e quando sei solo alla ricerca di "cattivi" codifiche da un elenco noto di strumenti. (ad esempio, SQL Management Studio utilizza come impostazione predefinita UTF16, che ha interrotto GIT auto-cr-lf per Windows, impostazione predefinita per molti anni).


Get-FileEncodingnon sembra esistere sul mio sistema. È un cmdlet personalizzato?
Xavier Poinas,

Esistono molte varianti di Get-FileEncodingsu poshcode. Ho anche recensito il codice di accesso da python e nodejs, ma questa versione ridotta raggiunge 80/20 per il mio utilizzo (più simile al 99/1). Se si ospitano file di altre persone vi suggerisco di utilizzare fileil comando dalla risposta di Syben ( stackoverflow.com/a/34766140/195755 ) o un altro decoder unicode produzione di qualità.
yzorg,

Va aggiunto che questo metodo funziona solo se è presente la DBA ... il che non è sempre il caso
Yepeekai,

@Yepeekai L'ultima riga è la defaultcodifica (quando nessuna distinta base). Per XML, JSON e JavaScript il valore predefinito è UTF8, ma il chilometraggio può variare.
yzorg,

@yzorg: ma questo è un modo morto per farlo. Stai solo mentendo all'utente. Almeno la maggior parte dei parser fa un'ipotesi colta. Se non riesci a fare un'ipotesi, lancia un errore e informa che è necessaria una distinta base per utilizzare il codice (e quindi utilizzare un altro strumento più intelligente, poiché molti già esistono).
Ed S.

7

Ho scritto la risposta n. 4 (al momento della stesura). Ma ultimamente ho installato git su tutti i miei computer, quindi ora uso la soluzione di @ Sybren. Ecco una nuova risposta che rende questa soluzione utile da PowerShell (senza mettere tutto git / usr / bin nel PERCORSO, che è troppo disordinato per me).

Aggiungi questo al tuo profile.ps1:

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

E usato come: file.exe --mime-encoding *. È necessario includere .exe nel comando affinché l'alias PS funzioni.

Ma se non personalizzi il tuo profilo PowerShell.ps1 ti suggerisco di iniziare con il mio: https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 e salvarlo in ~\Documents\WindowsPowerShell. È sicuro da usare su un computer senza Git, ma scriverà avvisi quando Git non viene trovato.

Il .exe nel comando è anche il modo in cui uso C:\WINDOWS\system32\where.exeda PowerShell; e molti altri comandi della CLI del sistema operativo che sono "nascosti per impostazione predefinita" da PowerShell, * shrug *.


1
o potresti semplicemente usare filecome alias di file.exe invece di file.exe¯ \ _ (ツ) _ / ¯
ferrell_io

@ferrell_io TL; DR: PS si basa su .NET e .NET ha File classe statica, e PS ha abbastanza sovraccarichi confonderli con EXEs comuni che .exe io uso per differenziare PS da Win EXE: dir | where Size -lt 10000vs where.exe git.
yzorg,

@ferrell_io Lo uso where.exeper differenziarlo da wherein PS, che è un alias incorporato per Where-Object. Esempio: where.exe git* vs ls . | where Size -lt 10000
yzorg

@ferrell_io Quindi utilizzo lo stesso modello per file.exela classe statica vs .NET, che potrebbe essere necessario nello stesso script che rileva la codifica. Esempio: [File]::SetCreationTime("readme.md", [DateTime]::Now).
yzorg,

6

Una soluzione semplice potrebbe essere l'apertura del file in Firefox.

  1. Trascina e rilascia il file in Firefox
  2. Fare clic con il tasto destro sulla pagina
  3. Seleziona "Visualizza informazioni sulla pagina"

e la codifica del testo apparirà nella finestra "Informazioni sulla pagina".

inserisci qui la descrizione dell'immagine

Nota: se il file non è in formato txt, rinominalo in txt e riprova.

PS Per maggiori informazioni vedi questo articolo.


4

Installa git (su Windows devi usare git bash console). Genere:

file *   

per tutti i file nella directory corrente o

file */*   

per i file in tutte le sottodirectory



2

Simile alla soluzione sopra elencata con Blocco note, puoi anche aprire il file in Visual Studio, se lo stai utilizzando. In Visual Studio, puoi selezionare "File> Opzioni di salvataggio avanzate ..."

La casella combinata "Codifica:" ti dirà in particolare quale codifica è attualmente utilizzata per il file. Ha molte più codifiche di testo elencate qui rispetto al Blocco note, quindi è utile quando si tratta di vari file provenienti da tutto il mondo e qualsiasi altra cosa.

Proprio come Blocco note, puoi anche modificare la codifica dall'elenco di opzioni lì, e quindi salvare il file dopo aver premuto "OK". Puoi anche selezionare la codifica desiderata tramite l'opzione "Salva con codifica ..." nella finestra di dialogo Salva con nome (facendo clic sulla freccia accanto al pulsante Salva).


Bello ma quando provo ad aprire il file con Visual Studio, apre sempre il file nell'editor di testo associato (Notepad ++ per questo tipo di estensione).
barbara.post,

@ barbara.post sarebbe qualcosa a che fare con le tue impostazioni di Visual Studio, penso. Sono stato in grado di accedere a qualsiasi file di testo normale di qualsiasi tipo in Visual Studio. Probabilmente gli hai detto di andare su Notepad ++ ogni volta che incontra un file con quell'estensione. Questo è il mio pensiero, almeno.
JaykeBird,

2

Alcuni codici C qui per un rilevamento affidabile di ASCII, BOM e UTF8: https://unicodebook.readthedocs.io/guess_encoding.html

Solo ASCII, UTF-8 e codifiche che utilizzano una distinta base (UTF-7 con distinta base, UTF-8 con distinta base, UTF-16 e UTF-32) dispongono di algoritmi affidabili per ottenere la codifica di un documento. Per tutte le altre codifiche, devi affidarti all'euristica basata sulle statistiche.

MODIFICARE:

Una versione PowerShell di una risposta C # da: Un modo efficace per trovare la codifica di qualsiasi file . Funziona solo con le firme (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

1
@jeasoft Grazie. Ho aggiunto una correzione per impostare la directory corrente .net. stackoverflow.com/questions/11246068/...
js2010

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.