แปลงการเข้ารหัสไฟล์ข้อความ


15

ฉันมักจะพบไฟล์ข้อความ (เช่นไฟล์คำบรรยายในภาษาพื้นเมืองของฉันเปอร์เซีย ) ที่มีปัญหาการเข้ารหัสอักขระ ไฟล์เหล่านี้ถูกสร้างขึ้นบน Windows และบันทึกด้วยการเข้ารหัสที่ไม่เหมาะสม (ดูเหมือนว่าจะเป็น ANSI) ซึ่งมีลักษณะซึ่งพูดพล่อยๆและอ่านไม่ได้เช่นนี้:

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

ใน Windows สามารถแก้ไขได้อย่างง่ายดายโดยใช้Notepad ++เพื่อแปลงการเข้ารหัสเป็น UTF-8 ดังนี้

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

และผลลัพธ์ที่อ่านได้ถูกต้องเป็นเช่นนี้:

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

ฉันค้นหาโซลูชันที่คล้ายกันจำนวนมากใน GNU / Linux แต่น่าเสียดายที่โซลูชันที่แนะนำ (เช่นคำถามนี้ ) ไม่ทำงาน ที่สำคัญที่สุดฉันได้เห็นคนแนะนำiconvแล้วrecodeแต่ฉันไม่มีโชคกับเครื่องมือเหล่านี้ ฉันได้ทดสอบคำสั่งมากมายรวมถึงสิ่งต่อไปนี้และทั้งหมดล้มเหลว:

$ recode ISO-8859-15..UTF8 file.txt
$ iconv -f ISO8859-15 -t UTF-8 file.txt > out.txt
$ iconv -f WINDOWS-1252 -t UTF-8 file.txt > out.txt 

สิ่งเหล่านี้ไม่ได้ผล!

ฉันกำลังใช้ Ubuntu-14.04 และฉันกำลังมองหาวิธีแก้ไขปัญหาอย่างง่าย (อย่างใดอย่างหนึ่ง GUI หรือ CLI) ที่ทำงานเหมือนกับ Notepad ++

สิ่งสำคัญอย่างหนึ่งของการเป็น"วิ"คือผู้ใช้ไม่จำเป็นต้องตรวจสอบการเข้ารหัสแหล่งที่มา; เครื่องมือควรตรวจจับการเข้ารหัสแหล่งที่มาโดยอัตโนมัติและควรให้การเข้ารหัสเป้าหมายโดยผู้ใช้เท่านั้น แต่อย่างไรก็ตามฉันก็ยินดีที่จะรู้เกี่ยวกับวิธีการทำงานที่ต้องมีการเข้ารหัสแหล่งที่มาที่จะให้

หากใครบางคนต้องการกรณีทดสอบเพื่อตรวจสอบวิธีแก้ไขปัญหาต่าง ๆ ตัวอย่างด้านบนสามารถเข้าถึงได้ผ่านลิงค์นี้


2
ลอง: vim '+set fileencoding=utf-8' '+wq' file.txt.
muru

Farsi ควรจะเป็นiso-639แต่ที่ดูเหมือนจะไม่สามารถใช้งานได้ทั้งในหรือiconv อย่างน้อยผมไม่เห็นมันในการส่งออกของrecode iconv -l
terdon

@muru ฉันทดสอบข้อเสนอแนะของคุณด้วยvimแต่ไม่ได้ผล
Seyed Mohammad

@SeyedMohammad ยังคงเหมือนเดิมหรือไม่
muru

@muru Yup! ไม่มีการเปลี่ยนแปลง.
Seyed Mohammad

คำตอบ:


12

ไฟล์เหล่านี้ Windows ด้วยข้อความเปอร์เซียมีการเข้ารหัสที่ใช้ Windows 1256 ดังนั้นจึงสามารถถอดรหัสได้โดยคำสั่งคล้ายกับ OP พยายาม แต่มีชุดอักขระที่แตกต่างกัน กล่าวคือ:

recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(ประณามการร้องเรียนของผู้โพสต์ดั้งเดิมดูความคิดเห็น)

iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt

อันนี้สันนิษฐานว่าตัวแปรสภาวะแวดล้อม LANG ถูกตั้งค่าเป็นโลแคล UTF-8 หากต้องการแปลงเป็นการเข้ารหัสใด ๆ (UTF-8 หรืออื่น ๆ ) ไม่ว่าจะมีตำแหน่งที่ตั้งปัจจุบันใครสามารถพูดได้ว่า:

iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}

โปสเตอร์ดั้งเดิมนั้นยังสับสนกับความหมายของเครื่องมือบันทึกข้อความ (recode, iconv) สำหรับการเข้ารหัสซอร์ส ( ซอร์ส..หรือ -f) ต้องระบุการเข้ารหัสที่ไฟล์จะถูกบันทึก (โดยโปรแกรมที่สร้างขึ้น) มีบางคน (ไร้เดียงสา) ที่เดาจากตัวอักษร mojibake ในโปรแกรมที่พยายาม (แต่ล้มเหลว) ในการอ่าน การลองใช้ ISO-8859-15 หรือ WINDOWS-1252 สำหรับข้อความเปอร์เซียนั้นเป็นทางตันแน่นอน: การเข้ารหัสเหล่านี้ไม่ได้มีตัวอักษรเปอร์เซีย


@Seyed Mohammad: ตอนนี้มีการระบุคำสั่งอย่างชัดเจน
Incnis Mrsi

ขอบคุณ! คำสั่งที่สอง (อันที่ใช้iconv) ทำงาน แต่ตัวแรก (โดยใช้recode) ทำงานไม่ถูกต้องและเอาต์พุตยังคงพูดไม่ชัด แก้ไขคำตอบของคุณเพื่อรวมเฉพาะiconvคำสั่งและฉันจะทำเครื่องหมายเป็นคำตอบ
Seyed Mohammad

1
นอกจากนี้ยังปราศจากการตั้งค่าตัวแปร LANG หนึ่งสามารถทำได้: iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txtซึ่งฉันทดสอบและทำงาน ดังนั้นจึงควรแก้ไขคำสั่งของคุณเช่นนี้
Seyed Mohammad

ฉันเขียนสคริปต์ที่มีประโยชน์ตามคำสั่งการทำงานที่ฉันได้อธิบายไว้ในคำตอบอื่นที่นี่ ฉันหวังว่ามันจะช่วยให้ผู้ใช้ Linux ชาวเปอร์เซียคนอื่น ๆ ช่วยฉันได้มาก
Seyed Mohammad

@ karel: ขอบคุณ“ บ่น” เป็นคำกริยา - วลีถูกเขียนโดยไม่มีหลักไวยากรณ์
Incnis Mrsi

1

นอกเหนือจากiconvซึ่งเป็นเครื่องมือที่มีประโยชน์มากไม่ว่าจะเป็นของตัวเองหรือในสคริปต์ก็มีวิธีแก้ปัญหาที่ง่ายมากที่ฉันพบว่าพยายามคิดปัญหาเดียวกันสำหรับชุดอักขระภาษากรีก (Windows-1253 + ISO-8859-7)

ทั้งหมดที่คุณต้องทำคือการเปิดแฟ้มข้อความผ่าน Gedit "เปิด" โต้ตอบและไม่ได้โดยการดับเบิลคลิก ที่ด้านล่างของกล่องโต้ตอบมีหล่นลงสำหรับการเข้ารหัสซึ่งถูกตั้งค่าเป็น"ตรวจพบโดยอัตโนมัติ" เปลี่ยนเป็น "Windows-125x" หรือชุดโค้ดอื่นที่เหมาะสมและข้อความจะสามารถอ่านได้อย่างสมบูรณ์ใน Gedit จากนั้นคุณสามารถบันทึกโดยใช้การเข้ารหัส UTF-8 เพียงเพื่อให้แน่ใจว่าคุณจะไม่มีปัญหาเดียวกันอีกในอนาคต ...


1

เพื่อเป็นการแก้ปัญหาอย่างสมบูรณ์ฉันได้เตรียม Bash script ที่มีประโยชน์ตามiconvคำสั่งจากคำตอบของ Incnis Mrsi :

#!/bin/bash

if [ $# -lt 1 ]
then
   echo 'Specify at least one file to fix.'
   exit 1
fi

# Temp file to store conversion attempt(s).
tmp='tmp.fixed'

for file in "$@"
do
  # Try to fix the file encoding.
  if iconv -f WINDOWS-1256 "$file" -t UTF-8 > $tmp; then
    echo "Fixed: '$file'"
    cat $tmp > "$file"
  else
    echo "Failed to fix: '$file'"
  fi
done
rm $tmp

บันทึกสคริปต์นี้ในฐานะfix-encoding.shให้สิทธิ์ดำเนินการโดยใช้chmod +x fix-encoding.shและใช้งานดังนี้:

./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub

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


คุณไม่จำเป็นต้องนำไฟล์ $ ออกจาก"  ...  " เนื่องจากตัวแปรจะถูกขยายภายใต้เครื่องหมายคำพูดคู่และในข้อความแบบเปิด เฉพาะ'$ file' เท่านั้นที่จะแสดงผลโดยมีเครื่องหมายดอลลาร์โดยการทุบตี
Incnis Mrsi

ดังที่ฉันได้กล่าวถึงคำตอบที่โพสต์โดย 'Incnis Mrsi' คำตอบนั้นไม่สามารถทำงานได้และสคริปต์นี้ก็เช่นกัน
Seyed Mohammad

1

ฉันไม่ทราบว่าสิ่งนี้ใช้ได้กับ Farsi หรือไม่: ฉันใช้ Gedit มันให้ความผิดกับการเข้ารหัสที่ผิดและฉันสามารถเลือกสิ่งที่ฉันต้องการแปลเป็น UTF-8 มันเป็นเพียงแค่ข้อความที่ไม่จัดรูปแบบ แต่นี่เป็นภาพหน้าจอ !

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

ขออภัยในที่สุดฉันก็ผ่านไฟล์ข้อความของฉันดังนั้นตอนนี้พวกเขาทั้งหมดจะถูกแปลง

ฉันชอบ notepad ++ ด้วยก็ยังคิดถึงอยู่ดี


Gedit ไม่สามารถแก้ไขปัญหาได้ แม้ว่า Gedit จะไม่แสดงข้อผิดพลาดในการเข้ารหัสสำหรับไฟล์ของฉันแม้ว่ามันจะไม่สามารถแก้ไขได้ก็ตาม ฉันได้ลอง "บันทึกเป็น" ด้วยการเข้ารหัส UTF-8 ใน Gedit แต่ไม่สามารถแก้ปัญหาได้
Seyed Mohammad

1

ถ้าคุณชอบทำงานใน GUI แทน CLI เช่นฉัน:

  1. เปิดไฟล์ด้วย Geany (บรรณาธิการ)
  2. ไปที่เมนูไฟล์ -> โหลดซ้ำเป็น
  3. เลือกการเข้ารหัสที่สันนิษฐานเพื่อเปลี่ยนคำซึ่งพูดพล่อยๆเป็นอักขระที่สามารถระบุได้ในภาษาของคุณ ตัวอย่างเช่นหากต้องการอ่านภาษากรีกฉันจะโหลดใหม่เป็นภาษายุโรปตะวันตก -> กรีก (Windows-1253)
  4. ไปที่เมนูเอกสาร > ตั้งค่าการเข้ารหัส -> Unicode -> UTF-8
  5. บันทึก

ใช้งานไม่ได้ ..
Aurimas

0

วิธีแก้ปัญหาการทำงานที่ฉันพบคือการใช้โปรแกรมแก้ไขข้อความMicrosoft Visual Studioซึ่งเป็นฟรีแวร์และสำหรับ Linux

เปิดไฟล์ที่คุณต้องการแปลงการเข้ารหัสใน VS-Code ที่ด้านล่างของหน้าต่างมีปุ่มไม่กี่ปุ่ม หนึ่งในนั้นเกี่ยวข้องกับการเข้ารหัสไฟล์ดังที่แสดงด้านล่าง:

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

การคลิกที่ปุ่มนี้จะปรากฏขึ้นเมนูค่าใช้จ่ายซึ่งรวมถึงสองรายการ จากเมนูนี้เลือกตัวเลือก "เปิดอีกครั้งด้วยการเข้ารหัส" เช่นเดียวกับด้านล่าง:

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

จะเป็นการเปิดเมนูอื่นซึ่งรวมถึงรายการการเข้ารหัสที่แตกต่างกันดังที่แสดงด้านล่าง ตอนนี้เลือก "Arabic (Windows 1256)":

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

นี้จะแก้ไขข้อความซึ่งพูดพล่อยๆเช่นนี้:

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

ตอนนี้คลิกที่ปุ่มเข้ารหัสอีกครั้งและในเวลานี้เลือกตัวเลือก "บันทึกด้วยการเข้ารหัส" ดังต่อไปนี้:

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

และในเมนูใหม่เลือกตัวเลือก "UTF-8":

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

นี่จะบันทึกไฟล์ที่ถูกแก้ไขโดยใช้การเข้ารหัส UTF-8:

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

ทำ! :)


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