ฐานข้อมูล“ ASCII ที่ดีที่สุดสำหรับ Unicode” ของ Python อยู่ที่ไหน [ปิด]


86

ฉันมีข้อความบางส่วนที่ใช้เครื่องหมายวรรคตอน Unicode เช่นเครื่องหมายอัญประกาศคู่ด้านซ้ายเครื่องหมายอัญประกาศเดี่ยวด้านขวาสำหรับเครื่องหมายวรรคตอนเป็นต้นและฉันต้องการมันใน ASCII Python มีฐานข้อมูลของอักขระเหล่านี้ที่มีการแทนที่ ASCII หรือไม่ดังนั้นฉันจึงทำได้ดีกว่าการเปลี่ยนทั้งหมดเป็น "?" เหรอ?


คำตอบ:


90

Unidecodeดูเหมือนเป็นโซลูชันที่สมบูรณ์ มันจะแปลงคำพูดแฟนซีเป็นคำพูด ascii อักขระภาษาละตินที่เน้นเสียงเป็นแบบไม่เน้นเสียงและแม้แต่พยายามทับศัพท์เพื่อจัดการกับอักขระที่ไม่มี ASCII วิธีนี้ทำให้ผู้ใช้ของคุณไม่ต้องเห็นอะไรมากมาย เมื่อคุณต้องส่งข้อความของพวกเขาผ่านระบบ ascii 7 บิตแบบเดิม

>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing 

http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/


3
อืม .. umlauts เยอรมันถูกแปลงเป็นอักขระพื้นฐานแทนเช่นö = oe, ä = ae เป็นต้น
ThiefMaster

4
@ThiefMaster เป็นความเท่าเทียมกันในทุกภาษาหรือไม่? บางที Unidecode จะเป็นตัวหารร่วมที่ต่ำที่สุด
Mark Ransom

Unidecode ส่วนใหญ่เป็นโซลูชันที่ไม่ขึ้นกับภาษา สำหรับการแก้ปัญหาเยอรมันเป็นศูนย์กลางแปลง charecters บังคับด้วยตนเอง ( s/ö/oe/อื่น ๆ ) unidecodeก่อนที่จะทำความสะอาดส่วนที่เหลือด้วย
alexis

4
แท้จริงในฟินแลนด์เช่นในขณะที่ä -> a, ö -> oเป็นธรรมตรงไปตรงมาก็ยังคงเป็นที่นิยมในการaeและoe
Antti Haapala

25

unicodedata.normalizeในคำตอบเดิมของฉันฉันยังแนะ อย่างไรก็ตามฉันตัดสินใจที่จะทดสอบและปรากฎว่ามันใช้ไม่ได้กับเครื่องหมายคำพูด Unicode มันทำงานได้ดีในการแปลอักขระ Unicode ที่เน้นเสียงดังนั้นฉันจึงคาดเดาว่าunicodedata.normalizeจะใช้unicode.decompositionฟังก์ชันนี้ซึ่งทำให้ฉันเชื่อว่ามันน่าจะจัดการได้เฉพาะอักขระ Unicode ที่เป็นชุดตัวอักษรและเครื่องหมายกำกับเสียงเท่านั้น แต่ฉันไม่ได้เป็นอย่างนั้น ผู้เชี่ยวชาญด้านสเปค Unicode ดังนั้นฉันก็สามารถเต็มไปด้วยอากาศร้อน ...

ไม่ว่าในกรณีใดคุณสามารถใช้unicode.translateเพื่อจัดการกับอักขระเครื่องหมายวรรคตอนแทนได้ translateวิธีการใช้เวลาในพจนานุกรมของเลข Unicode จะเลข Unicode จึงคุณสามารถสร้างแผนที่ที่แปลเครื่องหมายวรรคตอน Unicode อย่างเดียวเครื่องหมายวรรคตอน ASCII-ที่เข้ากันได้:

'Maps left and right single and double quotation marks'
'into ASCII single and double quotation marks'
>>> punctuation = { 0x2018:0x27, 0x2019:0x27, 0x201C:0x22, 0x201D:0x22 }
>>> teststring = u'\u201Chello, world!\u201D'
>>> teststring.translate(punctuation).encode('ascii', 'ignore')
'"hello, world!"'

คุณสามารถเพิ่มการแมปเครื่องหมายวรรคตอนเพิ่มเติมได้หากจำเป็น แต่ฉันไม่คิดว่าคุณจำเป็นต้องกังวลเกี่ยวกับการจัดการอักขระวรรคตอน Unicode ทุกตัว หากคุณไม่จำเป็นต้องจัดการกับสำเนียงและเครื่องหมายกำกับเสียงอื่น ๆ คุณยังคงใช้unicodedata.normalizeเพื่อจัดการกับอักขระเหล่านั้นได้


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