Windows'da bir dosyanın kodlamasını alma


206

Bu gerçekten bir programlama sorusu değil, bir metin dosyasının geçerli kodlamasını almak için bir komut satırı veya Windows aracı (Windows 7) var mı? Tabii ben biraz C # app yazabilirsiniz ama zaten yerleşik bir şey olup olmadığını bilmek istedim?


12
Sanırım Windows'da bir dosyanın kodlaması başlığın ne olması gerektiğidir. Önceden bilmiyorsanız, asla kesin olarak tahmin edemezsiniz.
Tom Blodget

Yanıtlar:


223

Dosyanızı, Windows ile birlikte gelen normal eski vanilya Not Defteri'ni kullanarak açın.
" Farklı Kaydet ... " i tıklattığınızda dosyanın kodlamasını gösterir .
Şöyle görünecektir: resim açıklamasını buraya girin

Varsayılan olarak seçilen kodlama ne olursa olsun, dosya için geçerli kodlamanız budur.
UTF-8 ise, ANSI olarak değiştirebilir ve kodlamayı değiştirmek için kaydet'i tıklatabilirsiniz (veya tam tersi).

Birçok farklı kodlama türü olduğunun farkındayım, ancak ihracat dosyalarımızın UTF-8'de olduğu ve ANSI'ye ihtiyaç duyduğumda ihtiyacım olan tek şey buydu. Bir kerelik bir ihracattı, bu yüzden Not Defteri faturayı benim için uygun hale getirdi.

Bilginize: Anladığım kadarıyla " Unicode " un (Not Defteri'nde listelendiği gibi) UTF-16 için yanlış adlandırma olduğunu düşünüyorum .
Notepad'in " Unicode " seçeneği hakkında daha fazla bilgi: Windows 7 - UTF-8 ve Unicdoe


1
@Alex, Win-8 kullanmıyorum. Bir google araması yaparak, şu bağlantıyı buldum: Win-8 Not Defteri . Umarım bulursunuz çünkü sizi temin ederim, hala orada.
MikeTeeVee

1
Teşekkürler, ancak Windows 8.1'de kesinlikle not defteri adı verilen bir uygulama yoktur. Aramada not defteri girdiğinizde "düzenleyici" görünür. Ve bu da endoding açılan ve hiçbir menü yok
Alex

4
Not Defteri açılamayacak kadar büyük dosyalar için bu yöntem çalışmaz. Ve bu sınıra Notepad ++ gibi diğer editörlerden çok daha hızlı ulaşılıyor. Windows 8.1'imde Not Defteri var. Belki% windir% \ system32 \ notepad.exe'ye bakın?
Fabian Kessler

3
Not Defteri, Windows 8 ve Windows 10'da bulunmaktadır.
Alan B

6
Not Defteri, en azından Windows 3'ten beri Windows'un TÜM sürümlerine yüklenir.
Jean-François Larvoire

65

(Linux) komut satırı aracı 'dosya' Windows'ta GnuWin32 aracılığıyla kullanılabilir:

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

Git yüklü ise, C: \ Program Files \ git \ usr \ bin konumunda bulunur.

Misal:

    C: \ Kullanıcılar \ SH \ İndirilenler \ SquareRoot> dosya *
    _UpgradeReport_Files; rehber
    Hata ayıklama; rehber
    duration.h; ASCII C ++ program metni, CRLF satır sonlandırıcıları ile
    IPCH; rehber
    main.cpp; ASCII C program metni, CRLF satır sonlandırıcıları ile
    Precision.txt; ASCII metni, CRLF satır sonlandırıcıları ile
    Serbest bırakmak; rehber
    speed.txt; ASCII metni, CRLF satır sonlandırıcıları ile
    SquareRoot.sdf; veri
    SquareRoot.sln; UTF-8 Unicode (BOM ile) metni, CRLF satır sonlandırıcıları ile
    SquareRoot.sln.docstates.suo; PCX ver. 2.5 görüntü verisi
    SquareRoot.suo; CDF V2 Belgesi, bozuk: Özet bilgi okunamıyor
    SquareRoot.vcproj; XML belge metni
    SquareRoot.vcxproj; XML belge metni
    SquareRoot.vcxproj.filters; XML belge metni
    SquareRoot.vcxproj.user; XML belge metni
    squarerootmethods.h; ASCII C program metni, CRLF satır sonlandırıcıları ile
    UpgradeLog.XML; XML belge metni

    C: \ Kullanıcılar \ SH \ İndirilenler \ SquareRoot> dosya - mime-encoding *
    _UpgradeReport_Files; ikili
    Hata ayıklama; ikili
    duration.h; us-ascii
    IPCH; ikili
    main.cpp; us-ascii
    Precision.txt; us-ascii
    Serbest bırakmak; ikili
    speed.txt; us-ascii
    SquareRoot.sdf; ikili
    SquareRoot.sln; UTF-8
    SquareRoot.sln.docstates.suo; ikili
    SquareRoot.suo; CDF V2 Belgesi, bozuk: Özet infobinary okunamıyor
    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
bunun için git
2.x'e


1
Temel işlem için komut satırına geri dönmek zorunda değilsiniz, bu 2017, ancak iyi görünüyor.
Todd Partridge

1
Gibi diğer cevap diyor, ayrıca kullanabilirsiniz filekomutunu cygwin . Windows için herhangi bir POSIX araç seti olmalıdır file.
palswim

Windows için git'i yüklediyseniz, GIT BASH (bash emulator) içerir ve bu da 'file' komutunu içerir. Sadece kullandım ve işe yarıyor. Bir sonraki cevapta da bahsediliyor ...
Amir Katz

61

Windows Makinenizde "git" veya "Cygwin" varsa, dosyanızın bulunduğu klasöre gidin ve komutu yürütün:

file *

Bu size o klasördeki tüm dosyaların kodlama ayrıntılarını verecektir.


Yalnızca belirli bir dosya ile ilgilenen Eğer cevap ekleyerek, kullanabileceğiniz grep komutu sonuçlarını filtrelemek için file *komut
Khalil ebram

Sadece körü körüne dosya komutunu çalıştırmak yerine, bu soruyu cevaplayan tam komut file --mime-encodingdosyanın kodlamasını
almaktır


18

İşte BOM aracılığıyla Unicode metin kodlamaları ailesini nasıl tespit edeceğim. Bu yöntemin doğruluğu düşüktür, çünkü bu yöntem yalnızca metin dosyalarında (özellikle Unicode dosyaları) çalışmaktadır ve varsayılan olarak asciiBOM olmadığında (çoğu metin düzenleyicisi gibi) UTF8, HTTP / web ekosistemiyle eşleşmek istiyorsanız varsayılan değer olacaktır. ).

Güncelleme 2018 : Artık bu yöntemi önermiyorum. @Sybren tarafından önerilen GIT veya * nix araçlarından file.exe kullanılmasını öneririm ve bunu daha sonraki bir cevapta PowerShell aracılığıyla nasıl yapacağımı gösteririm .

# 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

Öneri: Bu oldukça iyi çalışabilir dir, lsya da Get-ChildItemsadece metin dosyaları bilinen çekler, satın alma işlemini tamamladığında araçlar bilinen listeden "kötü kodlamaları" arıyoruz. (örn. SQL Management Studio varsayılan olarak, uzun yıllardır varsayılan olan Windows için GIT auto-cr-lf'yi kırmış olan UTF16'ya ayarlanmıştır.)


Get-FileEncodingsistemimde görünmüyor. Özel bir cmdlet mi?
Xavier Poinas

Poshcode üzerinde birçok varyasyonu vardır Get-FileEncoding. Hatta python ve nodejs'den punycode'u inceledim, ancak bu küçük sürüm kullanımım için 80/20'ye (daha fazla 99/1 gibi) çarptı. Başkalarının dosyalarına ev sahipliği yapıyorsanız fileSyben'in cevabından ( stackoverflow.com/a/34766140/195755 ) veya başka bir üretim kalitesinde unicode kod çözücüden komut kullanmanızı öneririz .
yzorg

Bu yöntemin yalnızca ürün ağacı mevcutsa
işe yarayacağı

@Yepeekai Son satır defaultkodlama yapıyor (BOM olmadığında). XML, JSON ve JavaScript için varsayılan değer UTF8'dir, ancak kilometreniz değişebilir.
yzorg

@yzorg: ama bunu yapmanın ölü bir yolu. Sadece kullanıcıya yalan söylüyorsun. En azından ayrıştırıcıların çoğu eğitimli bir tahminde bulunur. Eğer bir tahminde bulunamazsanız sadece bir hata atın ve kodunuzu kullanmak için bir Malzeme Listesinin gerekli olduğunu söyleyin (ve daha sonra zaten mevcut olan başka bir daha akıllı aracı kullanın).
Ed S.

7

4. cevabı yazdım (yazarken). Ama son zamanlarda git'i tüm bilgisayarlarıma yükledim, şimdi @ Sybren'in çözümünü kullanıyorum. İşte bu çözümü powershell'den kullanışlı kılan yeni bir cevap (tüm git / usr / bin'i PATH'e koymadan, benim için çok fazla dağınıklık olmadan).

Bunu şu adrese ekleyin profile.ps1:

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

Ve gibi kullanılabilir: file.exe --mime-encoding *. Sen .exe içermelidir işe PS takma adı için komuta.

Ancak PowerShell profilinizi özelleştirmezseniz .ps1 Benimle başlamanızı öneririm: https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 ve kaydedin ~\Documents\WindowsPowerShell. Git bulunmayan bir bilgisayarda kullanmak güvenlidir, ancak git bulunamadığında uyarı yazar.

.Exe kullandığım nasıl komuta de C:\WINDOWS\system32\where.exepowershell den; ve powershell, * shrug * tarafından "varsayılan olarak gizlenmiş" diğer birçok OS CLI komutu.


1
ya da sadece file.exe file.exe\ _ (ツ) _ / ¯ yerine file.exe yerine takma adınız olarak kullanabilirsiniz
ferrell_io

@ferrell_io TL; DR: PS NET ve NET dayanan Dosya statik sınıfı vardır ve PS I Win EXE PS ayırt etmek .exe kullandıkları ortak EXE'ler ile yeterince kafa karıştırıcı aşırı yükleme yaparak sahiptir: dir | where Size -lt 10000vs where.exe git.
yzorg

@ferrell_io PS için yerleşik bir takma ad olan where.exeayırt etmek whereiçin kullanıyorum Where-Object. Örnek: where.exe git* vs ls . | where Size -lt 10000
yzorg

@ferrell_io Ben de kod file.exestatik tespit aynı komut dosyası gerekebilir NET statik sınıf için aynı desen kullanın . Örnek: [File]::SetCreationTime("readme.md", [DateTime]::Now).
yzorg

6

Basit bir çözüm, dosyayı Firefox'ta açmak olabilir.

  1. Dosyayı sürükleyip firefox'a bırakın
  2. Sayfayı sağ tıklayın
  3. "Sayfa Bilgilerini Görüntüle" yi seçin

ve metin kodlaması "Sayfa Bilgisi" penceresinde görünecektir.

resim açıklamasını buraya girin

Not: Dosya txt biçiminde değilse, sadece txt olarak yeniden adlandırın ve tekrar deneyin.

PS Daha fazla bilgi için bu makaleye bakın.


5

Git'i yükleyin (Windows'ta git bash konsolunu kullanmanız gerekir). Tür:

file *   

geçerli dizindeki tüm dosyalar için veya

file */*   

tüm alt dizinlerdeki dosyalar için



2

Yukarıda Not Defteri ile listelenen çözüme benzer şekilde, dosyayı kullanıyorsanız Visual Studio'da da açabilirsiniz. Visual Studio'da "Dosya> Gelişmiş Kaydetme Seçenekleri ..." ni seçebilirsiniz.

"Kodlama:" birleşik giriş kutusu, dosya için hangi kodlamanın kullanıldığını özellikle belirtir. Orada listelenen Not Defteri'nden çok daha fazla metin kodlaması vardır, bu nedenle dünyanın her yerinden çeşitli dosyalar ve başka her şeyle uğraşırken yararlıdır.

Not Defteri gibi, kodlamayı oradaki seçenekler listesinden değiştirebilir ve ardından "Tamam" düğmesine bastıktan sonra dosyayı kaydedebilirsiniz. İstediğiniz kodlamayı Farklı Kaydet iletişim kutusundaki "Kodlamayla Kaydet ..." seçeneğini kullanarak da (Kaydet düğmesinin yanındaki oku tıklayarak) seçebilirsiniz.


Güzel ama dosyayı Visual Studio ile açmaya çalıştığımda, dosyayı her zaman ilişkili metin düzenleyicisinde (bu tür dosya uzantısı için Notepad ++) açın.
barbara.post

@ barbara.post, Visual Studio ayarlarınızla ilgili bir şey olurdu diye düşünüyorum. Visual Studio'da herhangi bir türden düz metin dosyalarına erişebildim. Muhtemelen bu uzantıya sahip bir dosyayla karşılaştığında Notepad ++ 'a gitmesini söylemişsinizdir. En azından bu benim düşüncelerim.
JaykeBird

2

Güvenilir ascii, bom's ve utf8 algılama için bazı C kodları: https://unicodebook.readthedocs.io/guess_encoding.html

Yalnızca ASCII, UTF-8 ve BOM kullanan kodlamalar (BOM ile UTF-7, BOM ile UTF-8, UTF-16 ve UTF-32) bir belgenin kodlamasını almak için güvenilir algoritmalara sahiptir. Diğer tüm kodlamalar için, istatistiklere dayalı sezgisel taramalara güvenmeniz gerekir.

DÜZENLE:

Bir C # yanıtının powershell sürümü: Herhangi bir dosyanın Kodlamasını bulmanın etkili bir yolu . Sadece imzalarla (bombalar) çalışır.

# 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 Teşekkürler. .Net geçerli dizinini ayarlamak için bir düzeltme ekledim. stackoverflow.com/questions/11246068/…
js2010


0

EncodingChecker

Dosya Kodlama Denetleyicisi, bir veya daha fazla dosyanın metin kodlamasını doğrulamanızı sağlayan bir GUI aracıdır. Araç, seçilen tüm dosyalar için kodlamayı veya yalnızca belirttiğiniz kodlamaları olmayan dosyaları görüntüleyebilir.

Dosya Kodlama Denetleyicisi'nin çalışması için .NET 4 veya üstü gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.