นี่ไม่ใช่คำถามการเขียนโปรแกรมจริงๆมีบรรทัดคำสั่งหรือเครื่องมือ Windows (Windows 7) เพื่อรับการเข้ารหัสปัจจุบันของไฟล์ข้อความหรือไม่? แน่ใจว่าฉันสามารถเขียนแอพ C # ได้เล็กน้อย แต่ฉันอยากรู้ว่ามีบางอย่างในตัวอยู่แล้วหรือไม่
นี่ไม่ใช่คำถามการเขียนโปรแกรมจริงๆมีบรรทัดคำสั่งหรือเครื่องมือ Windows (Windows 7) เพื่อรับการเข้ารหัสปัจจุบันของไฟล์ข้อความหรือไม่? แน่ใจว่าฉันสามารถเขียนแอพ C # ได้เล็กน้อย แต่ฉันอยากรู้ว่ามีบางอย่างในตัวอยู่แล้วหรือไม่
คำตอบ:
เปิดไฟล์ของคุณโดยใช้วานิลลา Notepad เก่าที่มาพร้อมกับ Windows
มันจะแสดงการเข้ารหัสของไฟล์เมื่อคุณคลิก " บันทึกเป็น ... "
มันจะมีลักษณะเช่นนี้:
ไม่ว่าการเข้ารหัสที่เลือกเป็นค่าเริ่มต้นนั้นคือการเข้ารหัสปัจจุบันของคุณสำหรับไฟล์
หากเป็น UTF-8 คุณสามารถเปลี่ยนเป็น ANSI แล้วคลิกบันทึกเพื่อเปลี่ยนการเข้ารหัส (หรือในทางกลับกัน)
ฉันรู้ว่ามีการเข้ารหัสหลายประเภท แต่นี่คือทั้งหมดที่ฉันต้องการเมื่อฉันได้รับแจ้งว่าไฟล์ส่งออกของเราอยู่ใน UTF-8 และพวกเขาต้องการ ANSI มันเป็นการส่งออกเพียงครั้งเดียวดังนั้น Notepad จึงเหมาะสำหรับฉัน
FYI: จากความเข้าใจของฉันฉันคิดว่า " Unicode " (ตามที่ระบุไว้ใน Notepad) เป็นชื่อที่ไม่ถูกต้องสำหรับ UTF-16
เพิ่มเติมที่นี่ในตัวเลือก " Unicode " ของ Notepad : Windows 7 - UTF-8 และ Unicdoe
เครื่องมือ '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 สหรัฐอเมริกา
file
คำสั่งในCygwin ชุดเครื่องมือใด ๆ POSIX สำหรับ Windows file
ควรจะมี
หากคุณมี "git" หรือ "Cygwin" บนเครื่อง Windows ของคุณให้ไปที่โฟลเดอร์ที่มีไฟล์ของคุณและเรียกใช้คำสั่ง:
file *
นี่จะให้รายละเอียดการเข้ารหัสของไฟล์ทั้งหมดในโฟลเดอร์นั้น
file *
คำสั่ง
file --mime-encoding
การเข้ารหัสไฟล์
เครื่องมืออื่นที่ฉันพบว่ามีประโยชน์: https://archive.codeplex.com/?p=encodingchecker EXE สามารถพบได้ที่นี่
ต่อไปนี้เป็นวิธีการตรวจจับการเข้ารหัสข้อความในตระกูล 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 ที่กำหนดเอง?
Get-FileEncoding
ฉันได้ตรวจสอบ punycode จาก python และ nodejs แล้ว แต่รุ่นเล็ก ๆ นี้ใช้งานได้ 80/20 สำหรับการใช้งานของฉัน (เช่น 99/1) หากคุณกำลังโฮสต์ไฟล์ของคนอื่นฉันขอแนะนำให้คุณใช้file
คำสั่งจากคำตอบของ Syben ( stackoverflow.com/a/34766140/195755 ) หรือตัวถอดรหัส unicode คุณภาพการผลิตอื่น
default
เข้ารหัส (เมื่อไม่มี BOM) สำหรับ XML, JSON และ JavaScript ค่าเริ่มต้นคือ UTF8 แต่ระยะทางของคุณอาจแตกต่างกันไป
ฉันเขียนคำตอบ # 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 *
file
เป็นชื่อแทนของคุณเพื่อ file.exe แทนfile.exe
¯ \ _ (ツ) _ / ¯
dir | where Size -lt 10000
where.exe git
where.exe
จะแตกต่างจากwhere
ใน PS Where-Object
ซึ่งเป็นตัวในนามแฝงสำหรับ ตัวอย่าง: where.exe git*
vs ls . | where Size -lt 10000
file.exe
คลาสสถิต VS .NET ซึ่งคุณอาจต้องการในสคริปต์เดียวกันที่ตรวจจับการเข้ารหัส ตัวอย่าง: [File]::SetCreationTime("readme.md", [DateTime]::Now)
.
วิธีแก้ไขปัญหาอย่างง่ายอาจเปิดไฟล์ใน Firefox
และการเข้ารหัสข้อความจะปรากฏในหน้าต่าง "ข้อมูลหน้า"
หมายเหตุ: หากไฟล์ไม่อยู่ในรูปแบบ txt เพียงแค่เปลี่ยนชื่อเป็น txt แล้วลองอีกครั้ง
PS สำหรับข้อมูลเพิ่มเติมโปรดดูที่นี้บทความ
ติดตั้ง git (บน Windows คุณต้องใช้ git bash console) ประเภท:
file *
สำหรับไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันหรือ
file */*
สำหรับไฟล์ในไดเรกทอรีย่อยทั้งหมด
คุณสามารถใช้ยูทิลิตีฟรีที่ชื่อ Encoding Recognizer (ต้องใช้จาวา) คุณสามารถค้นหาได้ที่http://mindprod.com/products2.html#ENCODINGRECOGNISER
เช่นเดียวกับโซลูชันที่ระบุไว้ข้างต้นด้วย Notepad คุณยังสามารถเปิดไฟล์ใน Visual Studio ได้หากคุณใช้วิธีนี้ ใน Visual Studio คุณสามารถเลือก "ไฟล์> ตัวเลือกบันทึกขั้นสูง ... "
กล่องคำสั่งผสม "การเข้ารหัส:" จะบอกคุณโดยเฉพาะว่าการเข้ารหัสใดที่กำลังถูกใช้สำหรับไฟล์ มันมีการเข้ารหัสข้อความจำนวนมากอยู่ในนั้นมากกว่า Notepad จึงมีประโยชน์เมื่อจัดการกับไฟล์ต่าง ๆ จากทั่วโลกและสิ่งอื่นใด
เช่นเดียวกับ Notepad คุณสามารถเปลี่ยนการเข้ารหัสจากรายการตัวเลือกที่มีแล้วบันทึกไฟล์หลังจากกดปุ่ม "ตกลง" คุณสามารถเลือกการเข้ารหัสที่คุณต้องการผ่านตัวเลือก "บันทึกด้วยการเข้ารหัส ... " ในกล่องโต้ตอบบันทึกเป็น (โดยคลิกที่ลูกศรถัดจากปุ่มบันทึก)
รหัส 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
วิธีเดียวที่ฉันได้พบการทำเช่นนี้คือ VIM หรือ Notepad ++