Cơ sở dữ liệu “ASCII tốt nhất cho Unicode này” của Python ở đâu?


85

Tôi có một số văn bản sử dụng dấu câu Unicode, như dấu ngoặc kép bên trái, dấu ngoặc kép bên phải cho dấu nháy đơn, v.v. và tôi cần nó trong ASCII. Python có cơ sở dữ liệu của các ký tự này với các ký tự thay thế ASCII rõ ràng để tôi có thể làm tốt hơn là chuyển tất cả chúng thành "?" ?


21
Bạn là chiến binh dũng cảm. Unicode là kẻ thù không đội trời chung của python.
David Berger

2
Những người tìm thấy điều này có thể quan tâm Cách tốt nhất để loại bỏ dấu trong chuỗi unicode Python là gì?
Martin Thoma

Câu trả lời:


89

Unidecode trông giống như một giải pháp hoàn chỉnh. Nó chuyển đổi các dấu ngoặc kép thành dấu ngoặc kép ascii, các ký tự latin có dấu thành không có dấu và thậm chí cố gắng chuyển ngữ để xử lý các ký tự không có ASCII tương đương. Bằng cách đó, người dùng của bạn không phải xem nhiều? khi bạn phải chuyển văn bản của họ qua hệ thống ascii 7-bit kế thừa.

>>> 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
Hm .. âm sắc tiếng Đức được chuyển đổi thành ký tự cơ bản của chúng thay vì ví dụ: ö = oe, ä = ae, v.v.
ThiefMaster

4
@ThiefMaster những điểm tương đương đó có đúng trên tất cả các ngôn ngữ không? Có lẽ Unidecode sẽ là mẫu số chung thấp nhất.
Mark Ransom vào

Unidecode chắc chắn là giải pháp không phụ thuộc vào ngôn ngữ. Đối với giải pháp lấy tiếng Đức làm trung tâm, hãy chuyển đổi thủ công các trình sửa lỗi thích hợp ( s/ö/oe/, v.v.) trước khi làm sạch phần còn lại với unidecode.
alexis

4
Thật vậy, trong Phần Lan ví dụ, trong khi ä -> a, ö -> olà hoàn toàn sai, nó vẫn còn thích hợp hơn để aeoe
Antti Haapala

25

Trong câu trả lời ban đầu của tôi, tôi cũng đề nghị unicodedata.normalize. Tuy nhiên, tôi đã quyết định kiểm tra nó và hóa ra nó không hoạt động với dấu ngoặc kép Unicode. Nó hoạt động tốt trong việc dịch các ký tự Unicode có dấu, vì vậy tôi đoán unicodedata.normalizenó được triển khai bằng cách sử dụng unicode.decompositionhàm, điều này khiến tôi tin rằng nó có thể chỉ có thể xử lý các ký tự Unicode là sự kết hợp của một chữ cái và một dấu phụ, nhưng tôi không thực sự một chuyên gia về đặc điểm kỹ thuật Unicode, vì vậy tôi có thể cảm thấy hứng thú ...

Trong bất kỳ trường hợp nào, bạn có thể sử dụng unicode.translateđể xử lý các ký tự dấu câu. Các translatephương pháp có một cuốn từ điển của ordinals Unicode để ordinals Unicode, do đó bạn có thể tạo ra một bản đồ mà dịch Unicode chỉ dấu chấm câu để chấm câu ASCII tương thích:

'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!"'

Bạn có thể thêm nhiều ánh xạ dấu câu hơn nếu cần, nhưng tôi không nghĩ rằng bạn nhất thiết phải lo lắng về việc xử lý từng ký tự dấu câu Unicode. Nếu bạn làm cần phải xử lý dấu và dấu phụ khác, bạn vẫn có thể sử dụng unicodedata.normalizeđể đối phó với những ký tự.


21

Câu hỏi thú vị.

Google đã giúp tôi tìm thấy trang này mô tả bằng cách sử dụng mô-đun unicodedata như sau:

import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.