Uzyskaj kodowanie pliku w systemie Windows

206

To nie jest tak naprawdę pytanie programistyczne, czy istnieje wiersz poleceń lub narzędzie Windows (Windows 7), aby uzyskać bieżące kodowanie pliku tekstowego? Pewnie, że mogę napisać małą aplikację C #, ale chciałem wiedzieć, czy coś jest już wbudowane?

TheWebGuy
źródło
12
Odgadnij kodowanie pliku w systemie Windows, jaki powinien być tytuł. Jeśli nie wiesz z góry, nigdy nie będziesz w stanie zgadnąć.
Tom Blodget

Odpowiedzi:

222

Otwórz plik za pomocą zwykłego starego waniliowego Notatnika dostarczanego z systemem Windows.
Po kliknięciu „ Zapisz jako ... ” wyświetli się kodowanie pliku .
Będzie to wyglądać tak: wprowadź opis zdjęcia tutaj

Niezależnie od tego, jakie jest domyślnie wybrane kodowanie, takie jest twoje obecne kodowanie pliku.
Jeśli jest to UTF-8, możesz go zmienić na ANSI i kliknąć Zapisz, aby zmienić kodowanie (lub odwrotnie).

Zdaję sobie sprawę, że istnieje wiele różnych rodzajów kodowania, ale to wszystko, czego potrzebowałem, kiedy zostałem poinformowany, że nasze pliki eksportowe znajdują się w UTF-8 i wymagały ANSI. To był jednorazowy eksport, więc Notatnik pasował do mnie.

FYI: Z mojego zrozumienia uważam, że „ Unicode ” (jak wymieniono w Notatniku) jest błędem dla UTF-16.
Więcej informacji o opcji „ Unicode ” Notatnika : Windows 7 - UTF-8 i Unicdoe

MikeTeeVee
źródło
1
@Alex, nie używam Win-8. Przeprowadzając wyszukiwanie w Google, znalazłem ten link: Notatnik Win-8 . Mam nadzieję, że ją znajdziesz, ponieważ zapewniam cię, że wciąż tam jest.
MikeTeeVee,
1
Dzięki, ale w systemie Windows 8.1 zdecydowanie nie ma aplikacji o nazwie notatnik. Po wprowadzeniu notatnika do wyszukiwania pojawia się „edytor”. I to nie ma tego rozwijanego menu endodontów i żadnego menu
Alex
4
Ta metoda nie działa w przypadku plików, które są zbyt duże, aby otworzyć Notatnik. Ten limit jest osiągany znacznie szybciej niż inne edytory, takie jak Notepad ++. Mój Windows 8.1 ma Notatnik. Zajrzyj do% windir% \ system32 \ notepad.exe może?
Fabian Kessler,
3
Notatnik istnieje w systemie Windows 8 i Windows 10.
Alan B
6
Notatnik jest zainstalowany we WSZYSTKICH wersjach systemu Windows od wersji Windows 3 przynajmniej.
Jean-François Larvoire,
64

„Plik” wiersza polecenia (Linux) jest dostępny w systemie Windows za pośrednictwem GnuWin32:

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

Jeśli masz zainstalowany git, znajduje się on w folderze C: \ Program Files \ git \ usr \ bin.

Przykład:

    C: \ Users \ SH \ Downloads \ SquareRoot> plik *
    _UpgradeReport_Files; informator
    Odpluskwić; informator
    czas trwania. h; Tekst programu ASCII C ++ z terminatorami linii CRLF
    ipch; informator
    main.cpp; Tekst programu ASCII C z zakończeniami linii CRLF
    Precision.txt; Tekst ASCII z zakończeniami linii CRLF
    Wydanie; informator
    Speed.txt; Tekst ASCII z zakończeniami linii CRLF
    SquareRoot.sdf; dane
    SquareRoot.sln; Tekst UTF-8 Unicode (z BOM), z zakończeniami linii CRLF
    SquareRoot.sln.docstates.suo; PCX ver. 2,5 danych obrazu
    SquareRoot.suo; Dokument CDF V2, uszkodzony: Nie można odczytać informacji podsumowujących
    SquareRoot.vcproj; Tekst dokumentu XML
    SquareRoot.vcxproj; Tekst dokumentu XML
    SquareRoot.vcxproj.filters; Tekst dokumentu XML
    SquareRoot.vcxproj.user; Tekst dokumentu XML
    squarerootmethods.h; Tekst programu ASCII C z zakończeniami linii CRLF
    UpgradeLog.XML; Tekst dokumentu XML

    C: \ Users \ SH \ Downloads \ SquareRoot> plik - kodowanie MIME *
    _UpgradeReport_Files; dwójkowy
    Odpluskwić; dwójkowy
    czas trwania. h; us-ascii
    ipch; dwójkowy
    main.cpp; us-ascii
    Precision.txt; us-ascii
    Wydanie; dwójkowy
    Speed.txt; us-ascii
    SquareRoot.sdf; dwójkowy
    SquareRoot.sln; utf-8
    SquareRoot.sln.docstates.suo; dwójkowy
    SquareRoot.suo; Dokument CDF V2, uszkodzony: Nie można odczytać streszczenia pliku informacyjnego
    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
źródło
1
zauważ, że prawdopodobnie potrzebujesz do tego git 2.x, nie mam go z git 1.9.5
jakub.g
W moim pliku jest napisane „binarny” :(
barbara.post
1
To niewiarygodne, że muszę wrócić do wiersza poleceń dla podstawowej operacji, to jest 2017, ale wygląda na to, że da sobie radę.
Todd Partridge
1
Jak mówi druga odpowiedź , możesz także użyć filepolecenia w cygwin . Każdy zestaw narzędzi POSIX dla Windows powinien mieć file.
palswim
Jeśli zainstalowałeś git dla Windows, zawiera on GIT BASH (emulator bash), który z kolei zawiera polecenie „file”. Właśnie go użyłem i działa. Wspomniano o tym również w następnej odpowiedzi ...
Amir Katz
61

Jeśli masz „git” lub „Cygwin” na komputerze z systemem Windows, przejdź do folderu, w którym znajduje się plik, i wykonaj polecenie:

file *

To da ci szczegóły kodowania wszystkich plików w tym folderze.

George Ninan
źródło
dodając do swojej odpowiedzi, jeśli interesuje Cię tylko określony plik, możesz użyć polecenia grep do filtrowania wyników file *polecenia
ebram khalil
Zamiast po prostu ślepo działającego polecenia pliku, pełnym poleceniem, które odpowiada na to pytanie, jest file --mime-encodinguzyskanie kodowania pliku
smac89
23

Inne narzędzie, które uznałem za przydatne: https://archive.codeplex.com/?p=encodingchecker EXE można znaleźć tutaj

użytkownik961954
źródło
4
Naprawdę pomocny w analizie wielu plików
Eric Bonnot
1
Natychmiastowa odpowiedź nawet w przypadku bardzo dużych plików (jak można się spodziewać).
Fabian Kessler,
1
Działa na bieżącym systemie Windows 10.
barbara.post
2
nie mogę ustalić, gdzie znajduje się plik exe na tej stronie. Czy link jest nieaktualny?
Christoph
1
@MarkDeven Dodałem ścieżkę do
pliku
17

Oto moje podejście do wykrywania rodziny kodowań tekstowych Unicode za pomocą BOM. Dokładność tej metody jest niska, ponieważ ta metoda działa tylko na plikach tekstowych (w szczególności plikach Unicode) i domyślnie jest stosowana, asciigdy nie ma BOM (jak większość edytorów tekstowych, domyślnie byłoby, UTF8jeśli chcesz dopasować ekosystem HTTP / web) ).

Aktualizacja 2018 : Nie polecam już tej metody. Polecam użycie file.exe z narzędzi GIT lub * nix, zgodnie z zaleceniami @Sybren, i pokażę, jak to zrobić za pomocą programu PowerShell w późniejszej odpowiedzi .

# 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

Zalecenie: To może pracować dość dobrze, jeśli dir, lslub Get-ChildItemtylko sprawdza znane pliki tekstowe, a gdy tylko szukasz kodowań „złych” Z listy znanych narzędzi. (tzn. domyślnie SQL Management Studio to UTF16, który złamał GIT auto-cr-lf dla Windows, który był domyślny przez wiele lat).

Yzorg
źródło
Get-FileEncodingwydaje się nie istnieć w moim systemie. Czy to niestandardowe polecenie cmdlet?
Xavier Poinas,
Istnieje wiele odmian Get-FileEncodingkodu poshcode. Sprawdziłem nawet kod punycode z python i nodejs, ale ta mała wersja trafiła w 80/20 dla mojego użycia (bardziej jak 99/1). Jeśli przechowujesz pliki innych osób, sugeruję użycie filepolecenia z odpowiedzi Sybena ( stackoverflow.com/a/34766140/195755 ) lub innego dekodera Unicode jakości produkcyjnej.
yzorg
Należy dodać, że ta metoda działa tylko wtedy, gdy BOM jest obecny ... co nie zawsze tak jest
Yepeekai
@Yepeekai Ostatni wiersz jest kodowany default(gdy nie ma BOM). W przypadku XML, JSON i JavaScript wartością domyślną jest UTF8, ale przebieg może się różnić.
yzorg,
@yzorg: ale jest to sposób na martwy mózg. Okłamujesz tylko użytkownika. Przynajmniej większość parserów zgaduje. Jeśli nie możesz zgadnąć, po prostu wyślij błąd i powiedz, że do korzystania z kodu wymagany jest zestawienie komponentów (a następnie skorzystaj z innego, inteligentniejszego narzędzia, ponieważ wiele już istnieje).
Ed S.
7

Napisałem odpowiedź nr 4 (w momencie pisania). Ale ostatnio zainstalowałem git na wszystkich moich komputerach, więc teraz używam rozwiązania @ Sybren. Oto nowa odpowiedź, która sprawia, że ​​to rozwiązanie jest przydatne z PowerShell (bez umieszczania całego git / usr / bin w PATH, co jest dla mnie zbyt dużym bałaganem).

Dodaj to do profile.ps1:

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

I używany jak: file.exe --mime-encoding *. Państwo musi zawierać .exe w komendzie PS alias do pracy.

Ale jeśli nie dostosujesz swojego profilu PowerShell.ps1, sugeruję zacząć od mojego: https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 i zapisz go w ~\Documents\WindowsPowerShell. Można go bezpiecznie używać na komputerze bez git, ale zapisuje ostrzeżenia, gdy git nie zostanie znaleziony.

Plik .exe w poleceniu jest także używany w programie C:\WINDOWS\system32\where.exePowerShell; oraz wiele innych komend CLI systemu operacyjnego, które są „domyślnie ukryte” przez PowerShell, * wzruszenie ramion *.

Yzorg
źródło
1
lub możesz użyć filejako aliasu do file.exe zamiast file.exe¯ \ _ (ツ) _ / ¯
ferrell_io
@ferrell_io TL; DR: PS jest oparta na .NET i .NET posiada klasę statyczną Plik, a PS ma dość mylące przeciążeń o wspólnych EXE że używam PS .exe do odróżnienia od Win EXE: dir | where Size -lt 10000vs where.exe git.
yzorg
@ferrell_io Używam where.exedo odróżnienia go od wherePS, który jest wbudowanym aliasem Where-Object. Przykład: where.exe git* vs ls . | where Size -lt 10000
yzorg
@ferrell_io Używam tego samego wzorca dla file.exeklasy statycznej vs .NET, która może być potrzebna w tym samym skrypcie wykrywającym kodowanie. Przykład: [File]::SetCreationTime("readme.md", [DateTime]::Now).
yzorg,
6

Prostym rozwiązaniem może być otwarcie pliku w przeglądarce Firefox.

  1. Przeciągnij i upuść plik w Firefox
  2. Kliknij stronę prawym przyciskiem myszy
  3. Wybierz „Wyświetl informacje o stronie”

a kodowanie tekstu pojawi się w oknie „Informacje o stronie”.

wprowadź opis zdjęcia tutaj

Uwaga: jeśli plik nie jest w formacie txt, po prostu zmień jego nazwę na txt i spróbuj ponownie.

PS Aby uzyskać więcej informacji, zobacz ten artykuł.

Just Shadow
źródło
4

Zainstaluj git (w systemie Windows musisz użyć konsoli git bash). Rodzaj:

file *   

dla wszystkich plików w bieżącym katalogu lub

file */*   

dla plików we wszystkich podkatalogach

phd_coder
źródło
2

Podobnie do rozwiązania wymienionego powyżej w Notatniku, możesz również otworzyć plik w Visual Studio, jeśli go używasz. W Visual Studio możesz wybrać „Plik> Zaawansowane opcje zapisywania ...”

Pole kombi „Kodowanie:” powie ci, które kodowanie jest obecnie używane dla pliku. Zawiera o wiele więcej kodowań tekstowych niż Notatnik, więc jest to przydatne, gdy mamy do czynienia z różnymi plikami z całego świata i cokolwiek innego.

Podobnie jak Notatnik, możesz również zmienić kodowanie z listy dostępnych tam opcji, a następnie zapisać plik po naciśnięciu „OK”. Możesz także wybrać odpowiednie kodowanie za pomocą opcji „Zapisz z kodowaniem ...” w oknie dialogowym Zapisz jako (klikając strzałkę obok przycisku Zapisz).

JaykeBird
źródło
Fajnie, ale kiedy próbuję otworzyć plik za pomocą Visual Studio, zawsze otwiera on plik w powiązanym edytorze tekstu (Notepad ++ dla tego rodzaju rozszerzenia pliku).
barbara.post
@ barbara.post, to może mieć coś wspólnego z Twoimi ustawieniami Visual Studio. Byłem w stanie uzyskać dostęp do dowolnego zwykłego pliku tekstowego dowolnego typu w Visual Studio. Prawdopodobnie powiedziałeś, aby po prostu przechodził do Notepad ++ za każdym razem, gdy napotka plik z tym rozszerzeniem. Przynajmniej takie są moje myśli.
JaykeBird,
2

Tutaj jest trochę kodu C do niezawodnego wykrywania ascii, bom's i utf8: https://unicodebook.readthedocs.io/guess_encoding.html

Tylko ASCII, UTF-8 i kodowanie przy użyciu BOM (UTF-7 z BOM, UTF-8 z BOM, UTF-16 i UTF-32) mają niezawodne algorytmy do uzyskania kodowania dokumentu. W przypadku wszystkich innych kodowań musisz zaufać heurystyce opartej na statystykach.

EDYTOWAĆ:

Wersja PowerShell odpowiedzi C # z: Skuteczny sposób na znalezienie kodowania dowolnego pliku . Działa tylko z podpisami (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
źródło
1
@jeasoft Thanks. Dodałem poprawkę, aby ustawić bieżący katalog .net. stackoverflow.com/questions/11246068/…
js2010
1

Jedynym sposobem, który udało mi się to zrobić, jest VIM lub Notepad ++.

Todd Partridge
źródło
2
Niestety nie są to narzędzia „wbudowane”
phuclv