ฉันจะแปลงไฟล์เป็นชุดในไดเรกทอรีเพื่อเข้ารหัส (เช่น ANSI-> UTF-8) ด้วยคำสั่งหรือเครื่องมือได้อย่างไร
สำหรับไฟล์เดียวตัวแก้ไขช่วย แต่จะทำไฟล์ขนาดใหญ่ได้อย่างไร?
ฉันจะแปลงไฟล์เป็นชุดในไดเรกทอรีเพื่อเข้ารหัส (เช่น ANSI-> UTF-8) ด้วยคำสั่งหรือเครื่องมือได้อย่างไร
สำหรับไฟล์เดียวตัวแก้ไขช่วย แต่จะทำไฟล์ขนาดใหญ่ได้อย่างไร?
คำตอบ:
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 .
iconv
ดูเหมือนว่าจะตัดทอนไฟล์เป็น 32,768 ไบต์หากเกินขนาดนี้ ในขณะที่เขาเขียนในไฟล์ที่เขาพยายามจะอ่านเขาก็สามารถทำงานได้ถ้าไฟล์นั้นมีขนาดเล็กพอที่จะตัดไฟล์โดยไม่มีการเตือนใด ๆ ...
ด้วย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
}
UTFCastเป็นตัวแปลง Unicode สำหรับ Windows ที่รองรับโหมดแบทช์ ฉันใช้เวอร์ชั่นที่จ่ายเงินแล้วและค่อนข้างสบายใจกับมัน
UTFCast เป็นตัวแปลง Unicode ที่ให้คุณแบทช์แปลงไฟล์ข้อความทั้งหมดเป็นการเข้ารหัสแบบ UTF ด้วยการคลิกเมาส์เพียงครั้งเดียว คุณสามารถใช้มันเพื่อแปลงไดเร็กทอรีที่เต็มไปด้วยไฟล์ข้อความเป็นการเข้ารหัส UTF ซึ่งรวมถึง UTF-8, UTF-16 และ UTF-32 เป็นไดเร็กทอรีเอาต์พุตในขณะที่ยังคงโครงสร้างโครงสร้างของไฟล์ต้นฉบับ มันไม่สำคัญว่าไฟล์ข้อความของคุณจะมีนามสกุลแตกต่างกันหรือไม่ UTFCast สามารถตรวจจับไฟล์ข้อความและแปลงไฟล์ได้โดยอัตโนมัติ
การเข้ารหัสอักขระของไฟล์ข้อความที่ตรงกันทั้งหมดจะถูกตรวจพบโดยอัตโนมัติและไฟล์ข้อความที่ตรงกันทั้งหมดจะถูกแปลงเป็นการ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-8
converted
find
คำสั่งเป็นประโยชน์อย่างมากสำหรับระบบอัตโนมัติการจัดการไฟล์ดังกล่าว
คลิกที่นี่เพื่อเพิ่มเติมfind
มากมาย
iconv -f original_charset -t utf-8 originalfile > newfile
เรียกใช้คำสั่งข้างต้นในการวนรอบ
ใช้สคริปต์ Python นี้: https://github.com/goerz/convert_encoding.pyมันใช้ได้กับทุกแพลตฟอร์ม ต้องการ Python 2.7
มีอยู่dos2unix
บนยูนิกซ์
มีอีกเครื่องมือที่คล้ายกันสำหรับ Windows ( อ้างอิงที่นี่อีก )
ฉันจะแปลงระหว่างไฟล์ข้อความ Unix และ Windows ได้อย่างไร มีลูกเล่นเพิ่มเติม
dos2unix
มีประโยชน์ในการแปลงตัวแบ่งบรรทัดแต่ OP กำลังค้นหาการแปลงการเข้ารหัสอักขระ
ในกรณีการใช้งานของฉันฉันต้องการการตรวจสอบการเข้ารหัสการป้อนข้อมูลโดยอัตโนมัติและมีมีเป็นจำนวนมากของไฟล์ที่มีWindows-1250
การเข้ารหัสซึ่งคำสั่งผลตอบแทนfile -bi <FILE>
นี้ไม่ได้เป็นพารามิเตอร์ที่ถูกต้องสำหรับcharset=unknown-8bit
iconv
ฉันมีผลลัพธ์ที่ดีที่สุดกับenca
แปลงไฟล์ทั้งหมดด้วยส่วนขยาย txt เป็น utf-8
find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;