Dapatkan penyandian file di Windows

206

Ini bukan pertanyaan pemrograman, apakah ada baris perintah atau alat Windows (Windows 7) untuk mendapatkan pengkodean file teks saat ini? Tentu saya bisa menulis aplikasi C # tapi saya ingin tahu apakah ada sesuatu yang sudah ada di dalamnya?

TheWebGuy
sumber
12
Tebak penyandian file di Windows adalah judulnya. Jika Anda tidak tahu sebelumnya, Anda tidak akan pernah bisa menebak dengan pasti.
Tom Blodget

Jawaban:

222

Buka file Anda menggunakan Notepad vanilla tua biasa yang datang dengan Windows.
Ini akan menunjukkan kepada Anda penyandian file ketika Anda mengklik " Simpan Sebagai ... ".
Ini akan terlihat seperti ini: masukkan deskripsi gambar di sini

Apa pun pengkodean yang dipilih default, itulah pengkodean Anda saat ini untuk file.
Jika UTF-8, Anda dapat mengubahnya ke ANSI dan klik simpan untuk mengubah pengkodean (atau visa-sebaliknya).

Saya menyadari ada banyak jenis pengkodean, tetapi ini yang saya butuhkan ketika saya diberitahu bahwa file ekspor kami ada di UTF-8 dan mereka membutuhkan ANSI. Itu adalah ekspor sekali pakai, jadi Notepad cocok untuk saya.

FYI: Dari pemahaman saya, saya pikir " Unicode " (sebagaimana tercantum dalam Notepad) adalah istilah yang keliru untuk UTF-16.
Lebih lanjut di sini pada opsi " Unicode " Notepad : Windows 7 - UTF-8 dan Unicdoe

MikeTeeVee
sumber
1
@ Alex, saya tidak menggunakan Win-8. Melakukan pencarian google, saya menemukan tautan ini: Win-8 Notepad . Saya harap Anda menemukannya karena saya meyakinkan Anda, itu masih ada.
MikeTeeVee
1
Terima kasih tetapi pada Windows 8.1 pasti tidak ada aplikasi yang disebut notepad. Saat Anda memasukkan notepad dalam pencarian, "editor" muncul. Dan ini tidak memiliki dropdown endoding dan tidak ada menu untuk itu
Alex
4
Metode ini tidak berfungsi untuk file yang terlalu besar untuk dibuka Notepad. Dan batas itu tercapai jauh lebih cepat daripada editor lain seperti Notepad ++. Windows 8.1 saya memang memiliki Notepad. Lihat di% windir% \ system32 \ notepad.exe mungkin?
Fabian Kessler
3
Notepad ada di Windows 8 dan Windows 10.
Alan B
6
Notepad diinstal di SEMUA versi Windows sejak Windows 3 setidaknya.
Jean-François Larvoire
64

'File' alat baris perintah (Linux) tersedia di Windows melalui GnuWin32:

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

Jika Anda telah menginstal git, itu terletak di C: \ Program Files \ git \ usr \ bin.

Contoh:

    C: \ Users \ SH \ Downloads \ SquareRoot> file *
    _UpgradeReport_Files; direktori
    Debug; direktori
    durasi.h; Teks program ASCII C ++, dengan terminator garis CRLF
    ipch; direktori
    main.cpp; Teks program ASCII C, dengan terminator garis CRLF
    Precision.txt; Teks ASCII, dengan terminator garis CRLF
    Melepaskan; direktori
    Speed.txt; Teks ASCII, dengan terminator garis CRLF
    SquareRoot.sdf; data
    SquareRoot.sln; Teks UTF-8 Unicode (with BOM), dengan terminator garis CRLF
    SquareRoot.sln.docstates.suo; PCX ver. 2,5 data gambar
    SquareRoot.suo; Dokumen CDF V2, rusak: Tidak dapat membaca informasi ringkasan
    SquareRoot.vcproj; Teks dokumen XML
    SquareRoot.vcxproj; Teks dokumen XML
    SquareRoot.vcxproj.filters; Teks dokumen XML
    SquareRoot.vcxproj.user; Teks dokumen XML
    squarerootmethods.h; Teks program ASCII C, dengan terminator garis CRLF
    UpgradeLog.XML; Teks dokumen XML

    C: \ Users \ SH \ Downloads \ SquareRoot> file --mime-encoding *
    _UpgradeReport_Files; biner
    Debug; biner
    durasi.h; kami-ascii
    ipch; biner
    main.cpp; kami-ascii
    Precision.txt; kami-ascii
    Melepaskan; biner
    Speed.txt; kami-ascii
    SquareRoot.sdf; biner
    SquareRoot.sln; utf-8
    SquareRoot.sln.docstates.suo; biner
    SquareRoot.suo; Dokumen CDF V2, rusak: Tidak dapat membaca ringkasan infobinary
    SquareRoot.vcproj; kami-ascii
    SquareRoot.vcxproj; utf-8
    SquareRoot.vcxproj.filters; utf-8
    SquareRoot.vcxproj.user; utf-8
    squarerootmethods.h; kami-ascii
    UpgradeLog.XML; kami-ascii
Sybren
sumber
1
perhatikan bahwa Anda mungkin perlu git 2.x untuk itu, saya tidak memilikinya dengan git 1.9.5
jakub.g
Untuk file saya tertulis "biner" :(
barbara.post
1
Sulit dipercaya harus kembali ke baris perintah untuk operasi dasar, ini 2017, tetapi tampaknya ok.
Todd Partridge
1
Seperti jawaban lainnya , Anda juga dapat menggunakan fileperintah di cygwin . Semua perangkat POSIX untuk Windows seharusnya file.
palswim
Jika Anda menginstal git untuk windows, itu termasuk GIT BASH (bash emulator), yang pada gilirannya menyertakan perintah 'file'. Hanya menggunakannya dan berfungsi. Disebutkan juga dalam jawaban berikutnya ...
Amir Katz
61

Jika Anda memiliki "git" atau "Cygwin" di Mesin Windows Anda, kemudian pergi ke folder tempat file Anda ada dan jalankan perintah:

file *

Ini akan memberi Anda detail pengodean dari semua file di folder itu.

George Ninan
sumber
menambah jawaban Anda, Jika Anda hanya tertarik pada file tertentu, Anda dapat menggunakan perintah grep untuk memfilter hasil file *perintah
ebram khalil
Alih-alih hanya menjalankan perintah file secara membabi buta, perintah lengkap yang menjawab pertanyaan ini adalah file --mime-encodinguntuk mendapatkan penyandian file
smac89
23

Alat lain yang menurut saya berguna: https://archive.codeplex.com/?p=encodingchecker EXE dapat ditemukan di sini

pengguna961954
sumber
4
Sangat membantu untuk menganalisis banyak file
Eric Bonnot
1
Jawaban instan bahkan dengan file yang sangat besar (seperti yang diharapkan).
Fabian Kessler
1
Bekerja pada Windows 10. saat ini
barbara.post
2
tidak dapat mengetahui di mana file exe berada di halaman itu. Apakah tautannya kedaluwarsa?
Christoph
1
@ MarkDeven Saya telah menambahkan path ke exe sebagai jawaban
user961954
17

Inilah cara saya mendeteksi keluarga Unicode dari penyandian teks melalui BOM. Keakuratan metode ini rendah, karena metode ini hanya berfungsi pada file teks (khususnya file Unicode), dan standarnya adalah asciiketika BOM tidak ada (seperti kebanyakan editor teks, defaultnya adalah UTF8jika Anda ingin mencocokkan ekosistem HTTP / web) ).

Pembaruan 2018 : Saya tidak lagi merekomendasikan metode ini. Saya merekomendasikan menggunakan file.exe dari GIT atau * nix tools seperti yang direkomendasikan oleh @Sybren, dan saya menunjukkan cara melakukannya melalui PowerShell di jawaban nanti .

# 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

Rekomendasi: ini dapat bekerja cukup baik jika dir, lsatau Get-ChildItemhanya memeriksa dikenal file teks, dan ketika Anda hanya mencari "pengkodean buruk" dari daftar yang dikenal alat. (yaitu SQL Management Studio default ke UTF16, yang memecahkan GIT auto-cr-lf untuk Windows, yang merupakan default selama bertahun-tahun.)

yzorg
sumber
Get-FileEncodingsepertinya tidak ada di sistem saya. Apakah ini cmdlet khusus?
Xavier Poinas
Ada banyak variasi Get-FileEncodingpada kode pos. Saya bahkan telah meninjau punycode dari python dan nodejs, tetapi versi kecil ini mencapai 80/20 untuk penggunaan saya (lebih seperti 99/1). Jika Anda meng-hosting file orang lain, saya sarankan Anda menggunakan fileperintah dari jawaban Syben ( stackoverflow.com/a/34766140/195755 ) atau decoder unicode lain yang berkualitas.
yzorg
Harus ditambahkan bahwa metode ini hanya berfungsi jika BOM ada ... yang tidak selalu terjadi
Yepeekai
@Yepeekai Baris terakhir adalah defaultpenyandian (bila tidak ada BOM). Untuk XML, JSON, dan JavaScript defaultnya adalah UTF8, tetapi jarak tempuh Anda mungkin beragam.
yzorg
@Yzorg: tapi itu cara mati otak untuk melakukannya. Anda hanya berbohong kepada pengguna. Setidaknya sebagian besar parser membuat tebakan yang berpendidikan. Jika Anda tidak dapat membuat dugaan, cukup lempar kesalahan dan beri tahu mereka bahwa diperlukan BOM untuk menggunakan kode Anda (dan kemudian gunakan alat lain yang lebih cerdas karena sudah ada).
Ed S.
7

Saya menulis jawaban # 4 (pada saat penulisan). Tapi akhir-akhir ini saya telah menginstal git di semua komputer saya, jadi sekarang saya menggunakan solusi @ Sybren. Berikut ini adalah jawaban baru yang membuat solusi itu berguna dari PowerShell (tanpa meletakkan semua git / usr / bin di PATH, yang terlalu banyak kekacauan bagi saya).

Tambahkan ini ke Anda profile.ps1:

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

Dan digunakan seperti: file.exe --mime-encoding *. Anda harus memasukkan .exe dalam perintah agar PS alias berfungsi.

Tetapi jika Anda tidak menyesuaikan profil PowerShell Anda. Saya sarankan Anda mulai dengan milik saya: https://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0 dan simpan untuk ~\Documents\WindowsPowerShell. Aman digunakan di komputer tanpa git, tetapi akan menulis peringatan saat git tidak ditemukan.

The .exe di perintah juga bagaimana saya menggunakan C:\WINDOWS\system32\where.exedari PowerShell; dan banyak perintah CLI OS lainnya yang "disembunyikan secara default" oleh powershell, * shrug *.

yzorg
sumber
1
atau Anda bisa menggunakan filesebagai alias Anda ke file.exe, bukan file.exe¯ \ _ (ツ) _ / ¯
ferrell_io
@ferrell_io TL; DR: PS didasarkan pada NET dan NET memiliki file kelas statis, dan PS memiliki cukup membingungkan overloads dengan ongkos umum yang saya gunakan exe untuk membedakan PS dari Win EXE: dir | where Size -lt 10000vs where.exe git.
yzorg
@ferrell_io Saya gunakan where.exeuntuk membedakannya dari wheredalam PS, yang merupakan alias bawaan untuk Where-Object. Contoh: where.exe git* vs ls . | where Size -lt 10000
yzorg
@ferrell_io Jadi saya menggunakan pola yang sama untuk file.exevs .NET kelas statis, yang mungkin Anda butuhkan dalam skrip yang sama yang mendeteksi pengkodean. Contoh: [File]::SetCreationTime("readme.md", [DateTime]::Now).
yzorg
6

Solusi sederhana mungkin membuka file di Firefox.

  1. Seret dan taruh file ke dalam firefox
  2. Klik kanan pada halaman
  3. Pilih "Lihat Info Halaman"

dan penyandian teks akan muncul di jendela "Info Halaman".

masukkan deskripsi gambar di sini

Catatan: Jika file tidak dalam format txt, cukup ganti namanya menjadi txt dan coba lagi.

PS Untuk info lebih lanjut lihat artikel ini .

Hanya Bayangan
sumber
4

Instal git (pada Windows Anda harus menggunakan git bash console). Tipe:

file *   

untuk semua file di direktori saat ini, atau

file */*   

untuk file di semua subdirektori

phd_coder
sumber
2

Mirip dengan solusi yang tercantum di atas dengan Notepad, Anda juga dapat membuka file di Visual Studio, jika Anda menggunakannya. Di Visual Studio, Anda dapat memilih "File> Advanced Save Options ..."

Kotak kombo "Pengodean:" akan memberi tahu Anda secara spesifik pengodean mana yang sedang digunakan untuk file tersebut. Ini memiliki lebih banyak penyandian teks yang terdaftar di sana daripada Notepad, jadi ini berguna ketika berurusan dengan berbagai file dari seluruh dunia dan apa pun yang lainnya.

Sama seperti Notepad, Anda juga dapat mengubah pengkodean dari daftar opsi di sana, dan kemudian menyimpan file setelah menekan "OK". Anda juga dapat memilih pengkodean yang Anda inginkan melalui opsi "Simpan dengan Pengkodean ..." di dialog Simpan Sebagai (dengan mengeklik panah di sebelah tombol Simpan).

JaykeBird
sumber
Bagus tetapi ketika saya mencoba untuk membuka file dengan Visual Studio, selalu membuka file dalam editor teks yang terkait (Notepad ++ untuk ekstensi file semacam ini).
barbara.post
@ barbara.post itu akan ada hubungannya dengan pengaturan Visual Studio Anda, saya pikir. Saya sudah bisa mengakses file teks biasa apa pun jenisnya di Visual Studio. Anda mungkin mengatakan kepadanya untuk membuka Notepad ++ setiap kali menemukan file dengan ekstensi itu. Setidaknya itulah pikiranku.
JaykeBird
2

Beberapa kode C di sini untuk deteksi ascii, bom, dan utf8 yang andal: https://unicodebook.readthedocs.io/guess_encoding.html

Hanya ASCII, UTF-8 dan penyandian menggunakan BOM (UTF-7 dengan BOM, UTF-8 dengan BOM, UTF-16, dan UTF-32) memiliki algoritma yang andal untuk mendapatkan penyandian dokumen. Untuk semua pengkodean lainnya, Anda harus mempercayai heuristik berdasarkan statistik.

EDIT:

Versi Powerhell jawaban C # dari: Cara efektif untuk menemukan Pengkodean file apa pun . Hanya bekerja dengan tanda tangan (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
sumber
1
@jeasoft Terima kasih. Saya menambahkan perbaikan untuk mengatur direktori .net saat ini. stackoverflow.com/questions/11246068/...
js2010
1

Satu-satunya cara yang saya temukan untuk melakukan ini adalah VIM atau Notepad ++.

Todd Partridge
sumber
2
Sayangnya mereka bukan alat "builtin"
phuclv