การแปลงไฟล์ UTF-8 เป็น ASCII (ความพยายามอย่างดีที่สุด)


23

ฉันมีไฟล์ใน UTF-8 ที่มีข้อความเป็นหลายภาษา ส่วนใหญ่เป็นชื่อของผู้คน ฉันต้องแปลงเป็น ASCII และฉันต้องการผลลัพธ์เพื่อให้ดูเหมาะสมที่สุด

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

เครื่องมือ Unix หรือไลบรารีภาษาการเขียนโปรแกรมที่มีอยู่ใน Unix สามารถให้การแปลงที่ดี (พยายามที่สุด) จาก UTF-8 เป็น ASCII ได้ไหม

ข้อความส่วนใหญ่เป็นภาษาที่ใช้ภาษาละตินยุโรป


1
คุณรู้หรือไม่ว่าภาษาเริ่มต้นที่ใด มีวิธีการจัดการกับความไม่พร้อมใช้งานของ umlaut (เช่นในö) ในภาษาเยอรมันคุณสามารถเขียน "oe" ได้เสมอ แต่เช่นในภาษาดัตช์ความไม่พร้อมของ umlaut จะดีกว่าที่จะ "อธิบาย" โดยเส้นประตามด้วยตัวอักษร umlauted (และ "oe" จะเป็นคำควบกล้ำที่แตกต่างอย่างสิ้นเชิง)
Anthon

คุณนิยาม“ เหมาะสมที่สุดเท่าที่จะทำได้” ได้อย่างไร? ความยากลำบากที่แท้จริงคือการกำหนดการแมป เมื่อเทียบกับงานการเขียนโปรแกรมที่เป็นเรื่องเล็กน้อย การจับคู่ที่ใช้จริงนั้นแตกต่างกันมากและอาจเป็นภาษาเฉพาะในสองวิธี: พวกเขาขึ้นอยู่กับภาษาของข้อความและภาษาที่สันนิษฐานของผู้อ่าน
Jukka K. Korpela

@ JukkaK.Korpela "เหมาะสมที่สุด" เป็นหลักสูตรที่กำหนดโดยผู้ที่สร้าง "เครื่องมือ Unix หรือไลบรารีภาษาโปรแกรมที่มีอยู่ใน Unix" ที่ฉันขอ หากสิ่งที่ดีที่สุดที่ฉันจะได้รับคือการแทนที่ทุกอย่างที่ไม่ใช่ ASCII ด้วยการขีดเส้นใต้นั่นหมายความว่าไม่มีอะไรที่ฉันสามารถทำได้อีกมาก ยกเว้นการเขียนเครื่องมือของตัวเองซึ่งฉันจะไม่ ฉันเดาว่า Unix @ SO อาจไม่ใช่สถานที่ที่ดีที่สุดสำหรับคำถามนี้…
user7610

1
@ user7610 อื่น ๆ กว่าiconvและtrมีUnidecode ฉันไม่คุ้นเคยกับมัน แต่อาจทำสิ่งที่คุณต้องการหากคุณสามารถใช้ Python
yellowantphil

1
@yellowantphil หรือnode-unidecodeใน JavaScript / node, UnidecodeSharp ในC♯หรือText :: Unidecodeใน Perl ซึ่งเกิดขึ้นเป็นชื่อแรกของชื่อนี้ ฉันเดาว่ามีรุ่นอื่น
user7610

คำตอบ:


11
konwert utf8-ascii

มันจะทำการแปลงที่ดีที่สุดโดยขึ้นอยู่กับตารางการแปลง หากคุณรู้ภาษาที่ป้อนโดยประมาณมีตัวกรองเฉพาะภาษาที่ให้ผลลัพธ์ที่ดีกว่าเช่น

konwert utf8-xmetodo

คือการแปลงภาษาเอสเปรันโตเป็นตัวแทน x-metodo

konwert UTF8-tex

จะพยายามทำการแทน TeX ของการกำกับโดยมีพารามิเตอร์เฉพาะภาษา:

konwert UTF8-ascii/de

จะแปล "ä" เป็น "ae" (เป็นภาษาเยอรมัน) แทนคำว่า "a"

konwert UTF8-ascii/rosyjski

จะใช้กฎโปแลนด์สำหรับการถอดเสียงภาษารัสเซียแทนภาษา "เหมือนภาษาอังกฤษ" ฯลฯ ...


นี่เป็นตำแหน่งล่าสุดของkonwertเว็บไซต์หรือไม่ มันบรรจุอยู่ที่ไหน? github.com/taw/konwert/tree/master/konwert-1.8
Nemo

25

สิ่งนี้จะใช้ได้กับบางสิ่ง:

iconv -f utf-8 -t ascii//TRANSLIT

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIThelloe ?ผลตอบแทน อักขระใด ๆ ที่iconvไม่ทราบวิธีการแปลงจะถูกแทนที่ด้วยเครื่องหมายคำถาม

iconvคือ POSIX แต่ฉันไม่รู้ว่าระบบทั้งหมดมีTRANSLITตัวเลือกหรือไม่ มันใช้งานได้สำหรับฉันบน Linux นอกจากนี้IGNOREตัวเลือกจะยกเลิกอักขระที่ไม่สามารถแสดงในชุดอักขระเป้าหมายได้อย่างเงียบ ๆ (ดูman iconv_open)

ตัวเลือกที่ด้อยกว่า แต่ใช้กับ POSIX trได้ คำสั่งนี้แทนที่จุดโค้ดที่ไม่ใช่ ASCII ทั้งหมดด้วยเครื่องหมายคำถาม มันอ่านข้อความ UTF-8 ทีละหนึ่งไบต์ “ É” อาจถูกแทนที่ด้วยE?หรือ?ขึ้นอยู่กับว่ามันถูกเข้ารหัสโดยใช้สำเนียงรวมหรือตัวอักษรก่อน

echo café äëïöü | tr -d '\200-\277' | tr '\300-\377' '[?*]'

ตัวอย่างนั้นส่งคืนcaf? ?????โดยใช้อักขระที่คอมไพล์แล้ว


trไม่ได้หมายถึงการทำงานครั้งละหนึ่งไบต์ GNU tr ทำได้ แต่เป็นจุดบกพร่อง
Stéphane Chazelas

3
iconv -f utf-8 -t ascii//TRANSLITทำงานได้ดีสำหรับฉัน มันเปลี่ยนคำพูดหยิกเป็นคำพูดตรง ขอบคุณ
พันเอก Panic

โปรดทราบว่า iconv จะทำให้หายใจไม่ออกในตัวละครที่เน้นเสียงหนักเช่น Pinyin
sventechie

โปรดทราบว่า//TRANSLITยังสามารถใช้ได้กับชุดอื่น ๆ iso-8859-1//TRANSLITของตัวละครเช่น
Skippy le Grand Gourou

iconvให้iconv: illegal input sequence at position 1234และตัดไฟล์ให้ฉัน จะดีถ้ามันลบตัวละครและพยายามที่จะรับลำดับอีกครั้ง
jozxyqk


2

ฉันมีไฟล์ใน UTF-8 ที่มี [ชื่อบุคคล] ในหลายภาษา [ที่ฉันต้องการแปลงเป็นสิ่งที่มีความหมายเต็มใน ASCII]

คุณหมายถึงคุณต้องการที่จะแปลงชื่อต่อไปนี้เป็นสตริง ASCII บางอันที่บุคคลที่เกี่ยวข้องจะไม่คัดค้าน?

  • ஸ்றீனிவாஸராமானுஜன்ஐயங்கார்
  • عبداللهالثانيبنالحسين

ฉันสงสัยว่าไม่มีเครื่องมืออัตโนมัติที่สามารถทำได้ มีชื่อส่วนบุคคลได้ไม่มากหรือหลายภาษา ซอฟต์แวร์ไม่สามารถเลือกรุ่นที่ยอมรับได้ทางวัฒนธรรม อย่างน้อยก็ไม่มีซอฟต์แวร์ที่รู้มากเกี่ยวกับวัฒนธรรมของบุคคลที่เกี่ยวข้อง

ดูเพิ่มเติมที่/programming//a/1398403/477035


2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'สร้าง `` bd llth lthny bn lHsyn` ซึ่งมีการถอดเสียงที่ดีพอสำหรับจุดประสงค์ของฉัน
user7610

4
@ user7610: ดี แต่King Abdulla II ของ Jordanอาจไม่เห็นด้วย ฉันจะเตรียมคำอธิบายในกรณีที่มีคนสำคัญร้องเรียนถึง CEO :-)
RedGrittyBrick

2

ฉันลงเอยด้วยการใช้ Perl กับText :: Unidecodeสำหรับสิ่งนี้ ตัวอย่าง:

perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")

ผลิตผลbd llh lthny bn lHsynซึ่งเป็นผลลัพธ์ที่ยอมรับได้สำหรับวัตถุประสงค์ของฉัน

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