จะเปลี่ยนชื่อไฟล์เป็นการเข้ารหัสที่แตกต่างกันอย่างไร


8

ฉันมีการfile nameเข้ารหัส3 ชนิดบนreiserfsฮาร์ดไดรฟ์ที่ติดตั้ง: CP1251, KOI-8, UTF-8 และ ASCII ฉันต้องแปลงการเข้ารหัสทั้งหมดเป็น UTF-8 ซ้ำ ๆ มียูทิลิตี้ใดบ้างที่จะตรวจจับการเข้ารหัสซอร์สและแปลงเป็น UTF-8 หรือฉันต้องเขียนสคริปต์ Python


ในกรณีทั่วไปเป็นไปไม่ได้ที่จะ "เดา" การเข้ารหัสชื่อโดยอัตโนมัติ (ตัวอย่างเช่นลำดับไบต์ส่วนใหญ่เป็นไฟล์ชื่อ KOI-8 และ CP1251 (แต่แตกต่างกัน) ที่ถูกต้อง) คุณมีเงื่อนงำพิเศษที่จะช่วยรู้การเข้ารหัสชื่อหรือไม่?

ไม่มีเงื่อนงำอื่น ๆ :(
Pablo

คุณมีชื่อไฟล์ที่เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หรือไม่?

ใช่ฉันมีทั้งตัวพิมพ์เล็กและ (ทั้งหมด) ชื่อไฟล์ตัวพิมพ์ใหญ่
Pablo

ทุกคนที่ต้องการ? detoxตรวจสอบ มันใช้งานได้สำหรับฉันระหว่าง ISO-8859-1 และ UTF-8 โดยใช้-s iso8859_1-only
Alwin Kesler

คำตอบ:


12

ใช้ convmv ซึ่งเป็นเครื่องมือ CLI ที่แปลงชื่อไฟล์ระหว่างการเข้ารหัสที่แตกต่างกัน ในการแปลงจาก ( -f) การเข้ารหัสเหล่านี้เป็น ( -t) UTF-8 ให้ทำดังนี้:

convmv -f CP1251 -t UTF-8 inputfile
convmv -f KOI-8  -t UTF-8 inputfile
convmv -f ASCII  -t UTF-8 inputfile

นอกจากนี้หากคุณต้องการแปลงเนื้อหาไฟล์ให้ใช้iconvเครื่องมือ CLI เพื่อแปลงเนื้อหาไฟล์เป็นการเข้ารหัสที่แตกต่างกัน ในการแปลงจาก ( -f) การเข้ารหัสเหล่านี้เป็น ( -t) UTF-8 ให้ทำดังนี้:

iconv -f CP1251 -t UTF-8 inputfile > outputfile
iconv -f KOI-8  -t UTF-8 inputfile > outputfile
iconv -f ASCII  -t UTF-8 inputfile > outputfile

1
ไม่ใช่เนื้อหาไฟล์ที่ฉันต้องการแปลง แต่ชื่อไฟล์เอง
Pablo

ตกลง. คุณลอง convmv หรือไม่?
Marcos Rorizo ​​n จูเนียร์

ASCII เป็นชุดย่อยของ UTF-8 แล้วดังนั้นจึงไม่จำเป็นต้องแปลง
psusi

1

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

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`

มีไฟล์ที่จะเปลี่ยนชื่อด้วยตนเองมากเกินไป ... ฉันคิดว่าโค้ดเพจมีช่วงรหัสอักขระที่แตกต่างกัน
Pablo

@Pablo ไม่นั่นคือจุดทั้งหมด: ด้วยไบต์ 8 บิตคุณมีรหัสอักขระได้เพียง 256 ตัวเท่านั้น หลังจากลบชุดอักขระ ASCII ปกติและรหัสควบคุมที่เหลือ 128 สำหรับรหัสเพิ่มเติมซึ่งไม่เพียงพอที่จะเป็นตัวแทนของอักขระเต็มรูปแบบในทุกภาษา โค้ดเพจแต่ละเพจใช้โค้ด 128 ตัวบนเพื่อแสดงอักขระที่สำคัญสำหรับผู้ใช้ วิธีเดียวที่จะทราบได้ว่ามีการใช้งานอะไรอยู่คือลองแสดงแต่ละหน้ารหัสที่เป็นไปได้และดูว่าชื่อดูเหมือนสมเหตุสมผลหรือไม่และไม่ใช่สิ่งที่คอมพิวเตอร์ตัดสินใจ
psusi

ดีหลามchardetเป็นอย่างใดการตรวจสอบมัน ...
ปาโบล

@Pablo เรียบร้อย ... ดูเหมือนว่ามันจะเป็นการเดาที่ได้รับการศึกษาตามความชุกของตัวละครต่าง ๆ ในภาษาเขียน กล่าวอีกนัยหนึ่งก็คือสมมติว่าตัวละครบางตัวเช่น goofy glyphs นั้นได้รับความนิยมน้อยกว่าการพูดสำเนียง 'a' และพยายามตีความตัวละครในหน้ารหัสแต่ละหน้าและค้นหาตัวอักษรที่มีรหัสมากที่สุด อาจเป็นไปได้ว่าไม่ถูกต้องมากนักโดยเฉพาะอย่างยิ่งอักขระบางตัวเช่นชื่อไฟล์
psusi

0

วิธีการแก้ปัญหาเดียวกันกับiconv@psusi sugeses แต่ด้วยห่วงและ while-card:

shสคริปต์เชลล์ออนไลน์ด้วย:

for f in /path/*.txt; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done

ด้วยการอ่าน while-card จากไปป์ไลน์:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.