แปลงไฟล์ Batch สำหรับการเข้ารหัส


46

ฉันจะแปลงไฟล์เป็นชุดในไดเรกทอรีเพื่อเข้ารหัส (เช่น ANSI-> UTF-8) ด้วยคำสั่งหรือเครื่องมือได้อย่างไร

สำหรับไฟล์เดียวตัวแก้ไขช่วย แต่จะทำไฟล์ขนาดใหญ่ได้อย่างไร?


1
เกี่ยวข้อง: stackoverflow.com/questions/724083/…
nagul

คำตอบ:


36

CygwinหรือGnuWin32มอบเครื่องมือ Unix เช่นiconvและdos2unix(และunix2dos) ใน Unix / Linux / Cygwin คุณจะต้องใช้ "windows-1252" เป็นการเข้ารหัสแทน ANSI (ดูด้านล่าง) (เว้นแต่คุณจะรู้ว่าระบบของคุณกำลังใช้เพจรหัสอื่นนอกเหนือจาก 1252 เป็นเพจรหัสเริ่มต้นซึ่งในกรณีนี้คุณจะต้องบอกไอคอนเพจโค้ดที่ถูกต้องให้แปล)

แปลงจากหนึ่ง ( -f) เป็นอื่น ๆ ( -t) ด้วย:

$ iconv -f windows-1252 -t utf-8 infile > outfile

หรือในรูปแบบค้นหาทั้งหมดและพิชิต:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;

อีกวิธีหนึ่งคือ:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;

คำถามนี้ถูกถามบ่อยครั้งในเว็บไซต์นี้ดังนั้นนี่คือข้อมูลเพิ่มเติมเกี่ยวกับ "ANSI" ในการตอบคำถามที่เกี่ยวข้องCesarB กล่าวถึง :

มีการเข้ารหัสหลายอย่างซึ่งเรียกว่า "ANSI" ใน Windows ในความเป็นจริง ANSI คือการเรียกชื่อผิด iconv ไม่มีทางคาดเดาสิ่งที่คุณต้องการ

การเข้ารหัส ANSI เป็นการเข้ารหัสที่ใช้โดยฟังก์ชัน "A" ใน Windows API (ฟังก์ชัน "W" ใช้ UTF-16) การเข้ารหัสที่สอดคล้องกับปกติจะขึ้นอยู่กับภาษาของระบบ Windows ของคุณ ที่พบมากที่สุดคือ CP 1252 (หรือที่รู้จักในชื่อ Windows-1252) ดังนั้นเมื่อตัวแก้ไขของคุณบอกว่า ANSI มันมีความหมายว่า "ฟังก์ชั่น API ใดก็ตามที่ใช้เป็นการเข้ารหัส ANSI เริ่มต้น" ซึ่งเป็นการเข้ารหัสแบบ non-Unicode เริ่มต้นที่ใช้ในระบบของคุณ

เพจที่เขาเชื่อมโยงเพื่อให้ชิ้นอาหารอันโอชะในอดีต (อ้างอิงจากMicrosoft PDF ) บนต้นกำเนิดของ CP 1252 และ ISO-8859-1 ซึ่งเป็นการเข้ารหัสที่ใช้บ่อยครั้งหนึ่ง:

[... ] สิ่งนี้มาจากความจริงที่ว่าหน้ารหัส Windows 1252 นั้นมาจากแบบร่าง ANSI ซึ่งต่อมาได้กลายเป็นมาตรฐาน ISO 8859-1 อย่างไรก็ตามในการเพิ่มรหัสจุดลงในช่วงที่สงวนไว้สำหรับรหัสควบคุมในมาตรฐาน ISO หน้ารหัสของ Windows หน้า 1252 และหน้ารหัส Windows ที่ตามมาเดิมตามชุด ISO 8859-x เบี่ยงเบนจาก ISO จนถึงทุกวันนี้ก็ไม่ใช่เรื่องแปลกที่จะมีชุมชนการพัฒนาทั้งในและนอกไมโครซอฟท์สับสนหน้ารหัส 8859-1 กับ Windows 1252 รวมถึงดู "ANSI" หรือ "A" ใช้เพื่อแสดงการสนับสนุนหน้ารหัส Windows .


4
อย่าใช้ชื่อไฟล์เดียวกับอินพุตและเอาต์พุต! iconvดูเหมือนว่าจะตัดทอนไฟล์เป็น 32,768 ไบต์หากเกินขนาดนี้ ในขณะที่เขาเขียนในไฟล์ที่เขาพยายามจะอ่านเขาก็สามารถทำงานได้ถ้าไฟล์นั้นมีขนาดเล็กพอที่จะตัดไฟล์โดยไม่มีการเตือนใด ๆ ...
Niavlys

1
FYI คำถามนี้ถูกติดแท็กด้วย osx และดูเหมือนว่าคำสั่ง convert-all ทำงานบน Yosemite หรือ El Cap iconv version แอปเปิ้ลจัดส่งไม่รองรับ --verbose หรือ -o และไวยากรณ์การเปลี่ยนเส้นทาง stdout อื่นไม่ทำงานด้วยเหตุผลบางประการและส่งไปยัง stdout ปกติ
Scott McIntyre

28

ด้วยpowershellคุณสามารถทำสิ่งนี้:

%  get-content IN.txt | out-file -encoding ENC -filepath OUT.txt

ในขณะที่ ENC เป็นอะไรที่เหมือน unicode, ascii, utf8, utf32 ชำระเงิน 'ช่วยออกไฟล์'

เพื่อแปลงไฟล์ * .txt ทั้งหมดในไดเรกทอรีเป็น utf8 ให้ทำดังนี้:

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

ซึ่งสร้างเวอร์ชันที่แปลงแล้วของไฟล์. txt แต่ละไฟล์ใน DIR2

แก้ไข: หากต้องการแทนที่ไฟล์ในไดเรกทอรีย่อยทั้งหมดให้ใช้:

% foreach($i in ls -recurse -filter "*.java") {
    $temp = get-content $i.fullname
    out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}

แปลงจาก ANSI เป็น UTF ผ่านข้อเสนอครั้งแรกของคุณไม่ลบเนื้อหาทั้งหมดของ textfile ของฉัน ...
Acroneos

@Acroneos: แล้วคุณทำผิด: ในไฟล์คือ IN.txt, outfile คือ OUT.txt ... ด้วยวิธีนี้มันเป็นไปไม่ได้ที่จะเขียนทับต้นฉบับ หากคุณใช้ชื่อไฟล์เดียวกันสำหรับ IN.txt และ OUT.txt คุณจะเขียนทับไฟล์ที่คุณกำลังอ่านอย่างชัดเจน
กิระ

Powershell จะแปลงเป็น UTF ด้วย BOM find และ iconv อาจจะง่ายกว่ามาก
pparas

6

หน้าวิกิพีเดียในการขึ้นบรรทัดใหม่มีส่วนในสาธารณูปโภคแปลง

นี่ดูเหมือนจะเป็นทางออกที่ดีที่สุดของคุณสำหรับการแปลงโดยใช้เครื่องมือที่มากับ Windows เท่านั้น:

TYPE unix_file | FIND "" /V > dos_file

3

UTFCastเป็นตัวแปลง Unicode สำหรับ Windows ที่รองรับโหมดแบทช์ ฉันใช้เวอร์ชั่นที่จ่ายเงินแล้วและค่อนข้างสบายใจกับมัน

UTFCast เป็นตัวแปลง Unicode ที่ให้คุณแบทช์แปลงไฟล์ข้อความทั้งหมดเป็นการเข้ารหัสแบบ UTF ด้วยการคลิกเมาส์เพียงครั้งเดียว คุณสามารถใช้มันเพื่อแปลงไดเร็กทอรีที่เต็มไปด้วยไฟล์ข้อความเป็นการเข้ารหัส UTF ซึ่งรวมถึง UTF-8, UTF-16 และ UTF-32 เป็นไดเร็กทอรีเอาต์พุตในขณะที่ยังคงโครงสร้างโครงสร้างของไฟล์ต้นฉบับ มันไม่สำคัญว่าไฟล์ข้อความของคุณจะมีนามสกุลแตกต่างกันหรือไม่ UTFCast สามารถตรวจจับไฟล์ข้อความและแปลงไฟล์ได้โดยอัตโนมัติ


ดูเหมือนว่าพวกเขาไม่สามารถแปลงเป็นโฟลเดอร์เดียวกันได้ แต่เป็นโฟลเดอร์ปลายทางอื่นเท่านั้น
Uwe Keim

รุ่นโปรช่วยให้การแปลงในสถานที่ $ 20/3 เดือน rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman

โอ้รุ่นด่วน (ฟรี) ไม่มีประโยชน์ - มันเท่านั้น "ตรวจจับ" utf-8 พร้อม BOM !! (ทุกคนสามารถทำที่ ) เฉพาะรุ่น Pro ที่ต่ออายุอัตโนมัติทุก 3 เดือนด้วยราคา $ 20 ต่อป๊อปอัปจะตรวจจับอัตโนมัติ ราคาสูงชันสำหรับผู้ใช้ที่ไม่ใช่องค์กร และระวังถ้าคุณลองใช้เวอร์ชันพื้นฐานและไฟล์ของคุณเป็น utf-8 แล้ว (ไม่มี BOM) ตัวแปลงนี้จะตรวจสอบว่าเป็น ASCII จากนั้น (อีกครั้ง) "แปลง" เป็น utf-8 ซึ่งอาจส่งผลซึ่งพูดพล่อยๆ . จงระวังให้ดีก่อนที่จะลองใช้เวอร์ชั่นด่วน! พวกเขามีเวอร์ชั่นเดโมสำหรับมืออาชีพที่ไม่มีเอาท์พุต - IMHO ไร้จุดหมายไม่สามารถตรวจสอบผลลัพธ์ก่อนซื้อได้!
SherylHohman

3

Oneliner ใช้การค้นหาพร้อมการตรวจจับอัตโนมัติ

การเข้ารหัสอักขระของไฟล์ข้อความที่ตรงกันทั้งหมดจะถูกตรวจพบโดยอัตโนมัติและไฟล์ข้อความที่ตรงกันทั้งหมดจะถูกแปลงเป็นการutf-8เข้ารหัส:

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

เพื่อดำเนินการตามขั้นตอนเหล่านี้เปลือกย่อยshจะใช้กับ-execวิ่งหนึ่งซับกับ-cธงและผ่านชื่อไฟล์เป็นอาร์กิวเมนต์ตำแหน่งด้วย"$1" -- {}ในระหว่างที่ไฟล์ที่ส่งออกเป็นชื่อชั่วคราวutf-8converted

findคำสั่งเป็นประโยชน์อย่างมากสำหรับระบบอัตโนมัติการจัดการไฟล์ดังกล่าว

คลิกที่นี่เพื่อเพิ่มเติมfindมากมาย




0

มีอยู่dos2unixบนยูนิกซ์
มีอีกเครื่องมือที่คล้ายกันสำหรับ Windows ( อ้างอิงที่นี่อีก )

ฉันจะแปลงระหว่างไฟล์ข้อความ Unix และ Windows ได้อย่างไร มีลูกเล่นเพิ่มเติม


2
dos2unixมีประโยชน์ในการแปลงตัวแบ่งบรรทัดแต่ OP กำลังค้นหาการแปลงการเข้ารหัสอักขระ
Sony Santos

0

คุณสามารถใช้EncodingMaster ได้ฟรีมีรุ่น Windows, Linux และ Mac OS X และใช้งานได้ดีจริงๆ


1
เว็บไซต์ที่คุณพูดถึงถูกปิด
Etienne Delavennat

0

ในกรณีการใช้งานของฉันฉันต้องการการตรวจสอบการเข้ารหัสการป้อนข้อมูลโดยอัตโนมัติและมีมีเป็นจำนวนมากของไฟล์ที่มีWindows-1250การเข้ารหัสซึ่งคำสั่งผลตอบแทนfile -bi <FILE> นี้ไม่ได้เป็นพารามิเตอร์ที่ถูกต้องสำหรับcharset=unknown-8biticonv

ฉันมีผลลัพธ์ที่ดีที่สุดกับenca

แปลงไฟล์ทั้งหมดด้วยส่วนขยาย txt เป็น utf-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.