รับการเข้ารหัสไฟล์ใน Windows


206

นี่ไม่ใช่คำถามการเขียนโปรแกรมจริงๆมีบรรทัดคำสั่งหรือเครื่องมือ Windows (Windows 7) เพื่อรับการเข้ารหัสปัจจุบันของไฟล์ข้อความหรือไม่? แน่ใจว่าฉันสามารถเขียนแอพ C # ได้เล็กน้อย แต่ฉันอยากรู้ว่ามีบางอย่างในตัวอยู่แล้วหรือไม่


12
เดาการเข้ารหัสไฟล์ใน Windowsเป็นสิ่งที่ชื่อควร หากคุณไม่ทราบล่วงหน้าคุณจะไม่สามารถเดาได้แน่นอน
Tom Blodget

คำตอบ:


222

เปิดไฟล์ของคุณโดยใช้วานิลลา Notepad เก่าที่มาพร้อมกับ Windows
มันจะแสดงการเข้ารหัสของไฟล์เมื่อคุณคลิก " บันทึกเป็น ... "
มันจะมีลักษณะเช่นนี้: ป้อนคำอธิบายรูปภาพที่นี่

ไม่ว่าการเข้ารหัสที่เลือกเป็นค่าเริ่มต้นนั้นคือการเข้ารหัสปัจจุบันของคุณสำหรับไฟล์
หากเป็น UTF-8 คุณสามารถเปลี่ยนเป็น ANSI แล้วคลิกบันทึกเพื่อเปลี่ยนการเข้ารหัส (หรือในทางกลับกัน)

ฉันรู้ว่ามีการเข้ารหัสหลายประเภท แต่นี่คือทั้งหมดที่ฉันต้องการเมื่อฉันได้รับแจ้งว่าไฟล์ส่งออกของเราอยู่ใน UTF-8 และพวกเขาต้องการ ANSI มันเป็นการส่งออกเพียงครั้งเดียวดังนั้น Notepad จึงเหมาะสำหรับฉัน

FYI: จากความเข้าใจของฉันฉันคิดว่า " Unicode " (ตามที่ระบุไว้ใน Notepad) เป็นชื่อที่ไม่ถูกต้องสำหรับ UTF-16
เพิ่มเติมที่นี่ในตัวเลือก " Unicode " ของ Notepad : Windows 7 - UTF-8 และ Unicdoe


1
@Alex ฉันไม่ได้ใช้ Win-8 การแสดงการค้นหาของ Google ผมพบลิงค์นี้: Win-8 Notepad ฉันหวังว่าคุณจะพบมันเพราะฉันรับรองกับคุณว่ามันยังอยู่ที่นั่น
MikeTeeVee

1
ขอบคุณ แต่บน Windows 8.1 ไม่มีแอพที่เรียกว่า notepad แน่นอน เมื่อคุณป้อนแผ่นจดบันทึกในการค้นหา "ตัวแก้ไข" จะปรากฏขึ้น และนี่ไม่ได้มีเมนูแบบเลื่อนลงการเข้ารหัสและไม่มีเมนูสำหรับมัน
Alex

4
วิธีนี้ใช้ไม่ได้กับไฟล์ที่มีขนาดใหญ่เกินกว่าที่ Notepad จะเปิดได้ และข้อ จำกัด นั้นมาถึงเร็วกว่าบรรณาธิการอื่น ๆ เช่น Notepad ++ Windows 8.1 ของฉันมี Notepad ดู% windir% \ system32 \ notepad.exe หรือไม่
Fabian Kessler

3
Notepad มีอยู่ใน Windows 8 และ Windows 10
Alan B

6
ติดตั้ง Notepad ใน Windows ทุกรุ่นตั้งแต่ Windows 3 เป็นอย่างน้อย
Jean-François Larvoire

64

เครื่องมือ 'Command' บรรทัดคำสั่ง (Linux) มีอยู่ใน Windows ผ่าน GnuWin32:

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

หากคุณติดตั้งคอมไพล์แล้วจะอยู่ใน C: \ Program Files \ git \ usr \ bin

ตัวอย่าง:

    C: \ Users \ SH \ Downloads \ SquareRoot> ไฟล์ *
    _UpgradeReport_Files; ไดเรกทอรี
    Debug; ไดเรกทอรี
    duration.h; ข้อความโปรแกรม ASCII C ++ พร้อมด้วยตัวสิ้นสุดบรรทัด CRLF
    ipch; ไดเรกทอรี
    main.cpp; ข้อความโปรแกรม ASCII C พร้อมด้วยตัวสิ้นสุดบรรทัด CRLF
    Precision.txt; ข้อความ ASCII ที่มีตัวต่อบรรทัด CRLF
    ปล่อย; ไดเรกทอรี
    Speed.txt; ข้อความ ASCII ที่มีตัวต่อบรรทัด CRLF
    SquareRoot.sdf; ข้อมูล
    SquareRoot.sln; ข้อความ UTF-8 Unicode (พร้อม BOM) พร้อมตัวต่อบรรทัด CRLF
    SquareRoot.sln.docstates.suo; เวอร์ชั่น PCX ข้อมูลภาพ 2.5
    SquareRoot.suo; เอกสาร CDF V2 เสียหาย: ไม่สามารถอ่านข้อมูลสรุปได้
    SquareRoot.vcproj; ข้อความเอกสาร XML
    SquareRoot.vcxproj; ข้อความเอกสาร XML
    SquareRoot.vcxproj.filters; ข้อความเอกสาร XML
    SquareRoot.vcxproj.user; ข้อความเอกสาร XML
    squarerootmethods.h; ข้อความโปรแกรม ASCII C พร้อมด้วยตัวสิ้นสุดบรรทัด CRLF
    UpgradeLog.XML; ข้อความเอกสาร XML

    C: \ Users \ SH \ Downloads \ SquareRoot> ไฟล์ - การเข้ารหัสรหัส *
    _UpgradeReport_Files; ไบนารี่
    Debug; ไบนารี่
    duration.h; ASCII สหรัฐอเมริกา
    ipch; ไบนารี่
    main.cpp; ASCII สหรัฐอเมริกา
    Precision.txt; ASCII สหรัฐอเมริกา
    ปล่อย; ไบนารี่
    Speed.txt; ASCII สหรัฐอเมริกา
    SquareRoot.sdf; ไบนารี่
    SquareRoot.sln; UTF-8
    SquareRoot.sln.docstates.suo; ไบนารี่
    SquareRoot.suo; เอกสาร CDF V2 เสียหาย: ไม่สามารถอ่านข้อมูลสรุปได้
    SquareRoot.vcproj; ASCII สหรัฐอเมริกา
    SquareRoot.vcxproj; UTF-8
    SquareRoot.vcxproj.filters; UTF-8
    SquareRoot.vcxproj.user; UTF-8
    squarerootmethods.h; ASCII สหรัฐอเมริกา
    UpgradeLog.XML; ASCII สหรัฐอเมริกา

1
โปรดทราบว่าคุณอาจต้องการ git 2.x สำหรับฉันฉันไม่มี git 1.9.5
jakub.g

สำหรับไฟล์ของฉันมันบอกว่า "binary" :(
barbara.post

1
ไม่น่าเชื่อที่จะต้องเปลี่ยนกลับไปเป็นบรรทัดคำสั่งสำหรับการดำเนินการขั้นพื้นฐานนี่คือ 2017 แต่ดูเหมือนว่าจะทำได้
Todd Partridge

1
เช่นเดียวกับคำตอบอื่น ๆกล่าวว่านอกจากนี้คุณยังสามารถใช้fileคำสั่งในCygwin ชุดเครื่องมือใด ๆ POSIX สำหรับ Windows fileควรจะมี
palswim

หากคุณติดตั้ง git สำหรับ windows จะมี GIT BASH (bash emulator) ซึ่งรวมถึงคำสั่ง 'file' เพียงแค่ใช้และใช้งานได้ มันถูกกล่าวถึงในคำตอบถัดไป ...
Amir Katz

61

หากคุณมี "git" หรือ "Cygwin" บนเครื่อง Windows ของคุณให้ไปที่โฟลเดอร์ที่มีไฟล์ของคุณและเรียกใช้คำสั่ง:

file *

นี่จะให้รายละเอียดการเข้ารหัสของไฟล์ทั้งหมดในโฟลเดอร์นั้น


เพิ่มคำตอบของคุณถ้าคุณสนใจเฉพาะไฟล์คุณสามารถใช้คำสั่ง grepเพื่อกรองผลลัพธ์ของfile *คำสั่ง
ebram khalil

แทนที่จะใช้คำสั่งไฟล์แบบสุ่มสี่สุ่มห้าคำสั่งแบบเต็มที่ตอบคำถามนี้คือfile --mime-encodingการเข้ารหัสไฟล์
smac89

23

เครื่องมืออื่นที่ฉันพบว่ามีประโยชน์: https://archive.codeplex.com/?p=encodingchecker EXE สามารถพบได้ที่นี่


4
มีประโยชน์มากในการวิเคราะห์หลายไฟล์
Eric Bonnot

1
ตอบได้ทันทีแม้กับไฟล์ที่มีขนาดใหญ่มาก (อย่างที่คาดไว้)
Fabian Kessler

1
ทำงานบน Windows ปัจจุบัน 10
barbara.post

2
ไม่สามารถระบุได้ว่าไฟล์ exe อยู่ที่ไหนในหน้านั้น ลิงก์ล้าสมัยหรือไม่
Christoph

1
@ MarkDeven ฉันได้เพิ่มเส้นทางไป exe ในคำตอบ
user961954

17

ต่อไปนี้เป็นวิธีการตรวจจับการเข้ารหัสข้อความในตระกูล Unicode ผ่าน BOM ความแม่นยำของวิธีนี้ต่ำเนื่องจากวิธีนี้ใช้ได้กับไฟล์ข้อความ (โดยเฉพาะไฟล์ Unicode เท่านั้น) และค่าเริ่มต้นasciiเมื่อไม่มี BOM อยู่ (เช่นเดียวกับโปรแกรมแก้ไขข้อความส่วนใหญ่ค่าเริ่มต้นคือUTF8ถ้าคุณต้องการจับคู่ HTTP / ระบบนิเวศบนเว็บ )

อัปเดต 2018 : ฉันไม่แนะนำวิธีนี้อีกต่อไป ผมขอแนะนำให้ใช้ file.exe จาก GIT หรือเครื่องมือระวัง * ตามคำแนะนำของ @Sybren และฉันจะแสดงวิธีการทำที่ผ่าน 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

คำแนะนำ: วิธีนี้สามารถทำงานได้ดีในกรณีที่dir,, lsหรือGet-ChildItemตรวจสอบเฉพาะไฟล์ข้อความที่รู้จักและเมื่อคุณกำลังมองหา "การเข้ารหัสที่ไม่ดี" จากรายการเครื่องมือที่รู้จัก (เช่น SQL Management Studio มีค่าเริ่มต้นเป็น UTF16 ซึ่งทำลาย GIT auto-cr-lf สำหรับ Windows ซึ่งเป็นค่าเริ่มต้นเป็นเวลาหลายปี)


Get-FileEncodingดูเหมือนไม่มีอยู่ในระบบของฉัน มันเป็น cmdlet ที่กำหนดเอง?
Xavier Poinas

POSHcode มีหลายรูปแบบ Get-FileEncodingฉันได้ตรวจสอบ punycode จาก python และ nodejs แล้ว แต่รุ่นเล็ก ๆ นี้ใช้งานได้ 80/20 สำหรับการใช้งานของฉัน (เช่น 99/1) หากคุณกำลังโฮสต์ไฟล์ของคนอื่นฉันขอแนะนำให้คุณใช้fileคำสั่งจากคำตอบของ Syben ( stackoverflow.com/a/34766140/195755 ) หรือตัวถอดรหัส unicode คุณภาพการผลิตอื่น
yzorg

ควรเพิ่มว่าวิธีนี้ใช้งานได้เฉพาะเมื่อมี BOM อยู่ ... ซึ่งไม่ใช่กรณีเสมอไป
Yepeekai

@Yepeekai บรรทัดสุดท้ายคือการdefaultเข้ารหัส (เมื่อไม่มี BOM) สำหรับ XML, JSON และ JavaScript ค่าเริ่มต้นคือ UTF8 แต่ระยะทางของคุณอาจแตกต่างกันไป
yzorg

@yzorg: แต่นั่นเป็นวิธีที่สมองต้องตาย คุณแค่โกหกผู้ใช้ อย่างน้อยตัวแยกวิเคราะห์ส่วนใหญ่จะทำการเดาที่มีการศึกษา หากคุณไม่สามารถคาดเดาได้เพียงแค่โยนข้อผิดพลาดและบอกพวกเขาว่าต้องใช้ BOM เพื่อใช้รหัสของคุณ (จากนั้นไปใช้เครื่องมืออื่นที่ชาญฉลาดซึ่งมีอยู่แล้วจำนวนมาก)
Ed S.

7

ฉันเขียนคำตอบ # 4 (ในขณะที่เขียน) แต่เมื่อเร็ว ๆ นี้ฉันได้ติดตั้งคอมไพล์ในคอมพิวเตอร์ทุกเครื่องของฉันดังนั้นตอนนี้ฉันใช้โซลูชันของ @ Sybren นี่คือคำตอบใหม่ที่ทำให้การแก้ปัญหานั้นสะดวกจาก powershell (โดยไม่ต้องใส่ git / usr / bin ทั้งหมดใน PATH ซึ่งเป็นสิ่งที่เกะกะเกินไปสำหรับฉัน)

เพิ่มลงในของคุณprofile.ps1:

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

และใช้เหมือน: file.exe --mime-encoding *. คุณต้องรวม. exeไว้ในคำสั่งเพื่อให้นามแฝงของ PS ทำงานได้

แต่ถ้าคุณไม่ได้ปรับแต่ง PowerShell คุณ profile.ps1 ผมขอแนะนำให้คุณเริ่มต้นด้วยข้าhttps://gist.github.com/yzorg/8215221/8e38fd722a3dfc526bbe4668d1f3b08eb7c08be0~\Documents\WindowsPowerShellและบันทึกลงใน มีความปลอดภัยในการใช้งานบนคอมพิวเตอร์ที่ไม่มีคอมไพล์ แต่จะเขียนคำเตือนเมื่อไม่พบคอมไพล์

.exeในคำสั่งนี้ยังเป็นวิธีที่ผมใช้C:\WINDOWS\system32\where.exeจาก PowerShell; และคำสั่ง OS CLI อื่น ๆ อีกมากมายที่ "ซ่อนไว้โดยค่าเริ่มต้น" โดย powershell, * shrug *


1
หรือคุณสามารถใช้fileเป็นชื่อแทนของคุณเพื่อ file.exe แทนfile.exe¯ \ _ (ツ) _ / ¯
ferrell_io

@ferrell_io TL; DR: PS จะขึ้นอยู่กับ NET และ .NET มีระดับคงที่ไฟล์และ PS มีเพียงพอทำให้เกิดความสับสนกับ overloads EXEs ทั่วไปที่ผมใช้ .exe เพื่อให้แตกต่างจาก Win PS EXE: VSdir | where Size -lt 10000 where.exe git
yzorg

@ferrell_io ผมใช้where.exeจะแตกต่างจากwhereใน PS Where-Objectซึ่งเป็นตัวในนามแฝงสำหรับ ตัวอย่าง: where.exe git* vs ls . | where Size -lt 10000
yzorg

@ferrell_io ดังนั้นฉันจึงใช้รูปแบบเดียวกันสำหรับfile.exeคลาสสถิต VS .NET ซึ่งคุณอาจต้องการในสคริปต์เดียวกันที่ตรวจจับการเข้ารหัส ตัวอย่าง: [File]::SetCreationTime("readme.md", [DateTime]::Now).
yzorg

6

วิธีแก้ไขปัญหาอย่างง่ายอาจเปิดไฟล์ใน Firefox

  1. ลากและวางไฟล์ลงใน firefox
  2. คลิกขวาที่หน้า
  3. เลือก "ดูข้อมูลหน้า"

และการเข้ารหัสข้อความจะปรากฏในหน้าต่าง "ข้อมูลหน้า"

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: หากไฟล์ไม่อยู่ในรูปแบบ txt เพียงแค่เปลี่ยนชื่อเป็น txt แล้วลองอีกครั้ง

PS สำหรับข้อมูลเพิ่มเติมโปรดดูที่นี้บทความ


4

ติดตั้ง git (บน Windows คุณต้องใช้ git bash console) ประเภท:

file *   

สำหรับไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันหรือ

file */*   

สำหรับไฟล์ในไดเรกทอรีย่อยทั้งหมด



2

เช่นเดียวกับโซลูชันที่ระบุไว้ข้างต้นด้วย Notepad คุณยังสามารถเปิดไฟล์ใน Visual Studio ได้หากคุณใช้วิธีนี้ ใน Visual Studio คุณสามารถเลือก "ไฟล์> ตัวเลือกบันทึกขั้นสูง ... "

กล่องคำสั่งผสม "การเข้ารหัส:" จะบอกคุณโดยเฉพาะว่าการเข้ารหัสใดที่กำลังถูกใช้สำหรับไฟล์ มันมีการเข้ารหัสข้อความจำนวนมากอยู่ในนั้นมากกว่า Notepad จึงมีประโยชน์เมื่อจัดการกับไฟล์ต่าง ๆ จากทั่วโลกและสิ่งอื่นใด

เช่นเดียวกับ Notepad คุณสามารถเปลี่ยนการเข้ารหัสจากรายการตัวเลือกที่มีแล้วบันทึกไฟล์หลังจากกดปุ่ม "ตกลง" คุณสามารถเลือกการเข้ารหัสที่คุณต้องการผ่านตัวเลือก "บันทึกด้วยการเข้ารหัส ... " ในกล่องโต้ตอบบันทึกเป็น (โดยคลิกที่ลูกศรถัดจากปุ่มบันทึก)


ดี แต่เมื่อฉันพยายามเปิดไฟล์ด้วย Visual Studio มันจะเปิดไฟล์ในตัวแก้ไขข้อความที่เกี่ยวข้องเสมอ (Notepad ++ สำหรับส่วนขยายไฟล์ประเภทนี้)
barbara.post

@ barbara.post ว่าเป็นสิ่งที่ต้องทำกับการตั้งค่า Visual Studio ของคุณฉันคิดว่า ฉันสามารถเข้าถึงไฟล์ข้อความธรรมดาทุกประเภทใน Visual Studio คุณอาจบอกให้ไปที่ Notepad ++ ทุกครั้งที่พบไฟล์ที่มีนามสกุลนั้น นั่นคือความคิดของฉันอย่างน้อย
JaykeBird

2

รหัส C บางส่วนสำหรับการตรวจสอบ ascii, bom's และ utf8 ที่เชื่อถือได้: https://unicodebook.readthedocs.io/guess_encoding.html

เฉพาะ ASCII, UTF-8 และการเข้ารหัสโดยใช้ BOM (UTF-7 ที่มี BOM, UTF-8 ที่มี BOM, UTF-16 และ UTF-32) มีอัลกอริทึมที่เชื่อถือได้เพื่อรับการเข้ารหัสของเอกสาร สำหรับการเข้ารหัสอื่น ๆ คุณจะต้องเชื่อถือฮิวริสติกตามสถิติ

แก้ไข:

รุ่น PowerShell ของ C # คำตอบจาก: วิธีที่มีประสิทธิภาพที่จะหาการเข้ารหัสไฟล์ใดใช้ได้กับลายเซ็นเท่านั้น (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 ขอบคุณ ฉันเพิ่มในการแก้ไขเพื่อตั้งไดเรกทอรีปัจจุบัน. net stackoverflow.com/questions/11246068/…
js2010

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.