2010-04-23 28 views
19

Tôi đang cố gắng tìm hiểu python và không thể tìm ra cách để dịch các script perl sau để python:Làm thế nào để thay thế các ký tự unicode bằng ký tự ascii bằng Python (tập lệnh perl đã cho)?

#!/usr/bin/perl -w      

use open qw(:std :utf8); 

while(<>) { 
    s/\x{00E4}/ae/; 
    s/\x{00F6}/oe/; 
    s/\x{00FC}/ue/; 
    print; 
} 

Kịch bản chỉ thay đổi umlauts unicode để đầu ra ascii thay thế. (Vì vậy, sản lượng hoàn chỉnh là trong ascii.) Tôi sẽ biết ơn đối với bất kỳ gợi ý. Cảm ơn!

+0

tìm kiếm SO cho "phiên âm" để tìm câu hỏi liên quan. – hop

+0

http://stackoverflow.com/questions/816285/where-is-pythons-best-ascii-for-this-unicode-database/816319#816319 – hop

+0

Tập lệnh Perl nhất định sẽ thực sự chỉ thay thế lần xuất hiện đầu tiên trên mỗi dòng, nhưng đó chắc chắn là một tai nạn. – tripleee

Trả lời

17
  • Sử dụng các module fileinput để lặp qua đầu vào tiêu chuẩn hoặc một danh sách các tập tin,
  • giải mã các dòng bạn đọc từ UTF-8 để unicode đối tượng
  • sau đó bản đồ bất kỳ ký tự unicode mà bạn mong muốn với phương pháp translate

translit.py sẽ trông như thế này:

#!/usr/bin/env python2.6 
# -*- coding: utf-8 -*- 

import fileinput 

table = { 
      0xe4: u'ae', 
      ord(u'ö'): u'oe', 
      ord(u'ü'): u'ue', 
      ord(u'ß'): None, 
     } 

for line in fileinput.input(): 
    s = line.decode('utf8') 
    print s.translate(table), 

Và bạn có thể sử dụng nó như thế này:

$ cat utf8.txt 
sömé täßt 
sömé täßt 
sömé täßt 

$ ./translit.py utf8.txt 
soemé taet 
soemé taet 
soemé taet 
  • Cập nhật:

Trong trường hợp bạn đang sử dụng python 3 chuỗi là bằng unicode mặc định và bạn không' cần phải mã hóa nó nếu nó chứa các ký tự không phải ASCII hoặc thậm chí là một ký tự không phải Latinh. Vì vậy, các giải pháp sẽ xem xét như sau:

line = 'Verhältnismäßigkeit, Möglichkeit' 

table = { 
     ord('ä'): 'ae', 
     ord('ö'): 'oe', 
     ord('ü'): 'ue', 
     ord('ß'): 'ss', 
     } 

line.translate(table) 

>>> 'Verhaeltnismaessigkeit, Moeglichkeit' 
+0

Và để có được kết quả ascii, dòng cuối cùng phải là 'print s.translate (table) .encode ('ascii', 'ignore')', tôi đoán vậy. – Frank

+0

nghiêm chỉnh nói bản gốc. PL không làm điều đó, nhưng có, đó sẽ là một trong những giải pháp – hop

+5

Mục tiêu dường như được de-umlauting văn bản tiếng Đức, để lại nó dễ hiểu. Hiệu ứng của 'ord (u'ß '): None' trong mã này là để ** xóa ** ký tự ß (" eszett "). Nó phải là 'ord (u'ß '): u'ss''. Upvotes ?? Câu trả lời được chấp nhận ??? –

36

Để chuyển đổi để ASCII bạn có thể muốn thử ASCII, Dammit hoặc this recipe, mà nắm tới:

>>> title = u"Klüft skräms inför på fédéral électoral große" 
>>> import unicodedata 
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore') 
'Kluft skrams infor pa federal electoral groe' 
+2

mà không có gì ở tất cả những gì bản gốc .pl làm (chủ yếu là phiên âm các ký tự đặc biệt của Đức) – hop

+3

Vâng, nhưng nó thực sự chính xác những gì tôi cần hiện nay! –

+3

große -> groe?!? –

3

tôi sử dụng translitcodec

>>> import translitcodec 
>>> print '\xe4'.decode('latin-1') 
ä 
>>> print '\xe4'.decode('latin-1').encode('translit/long').encode('ascii') 
ae 
>>> print '\xe4'.decode('latin-1').encode('translit/short').encode('ascii') 
a 

Bạn có thể thay đổi ngôn ngữ giải mã thành bất kỳ thứ gì bạn cần. Bạn có thể muốn có một hàm đơn giản để giảm độ dài của một lần triển khai đơn lẻ.

def fancy2ascii(s): 
    return s.decode('latin-1').encode('translit/long').encode('ascii') 
3

Bạn có thể thử unidecode để chuyển đổi Unicode thành ascii thay vì viết biểu thức chính quy thủ công. Nó là một cổng Python của Text::Unidecode mô-đun Perl:

#!/usr/bin/env python 
import fileinput 
import locale 
from contextlib import closing 
from unidecode import unidecode # $ pip install unidecode 

def toascii(files=None, encoding=None, bufsize=-1): 
    if encoding is None: 
     encoding = locale.getpreferredencoding(False) 
    with closing(fileinput.FileInput(files=files, bufsize=bufsize)) as file: 
     for line in file: 
      print unidecode(line.decode(encoding)), 

if __name__ == "__main__": 
    import sys 
    toascii(encoding=sys.argv.pop(1) if len(sys.argv) > 1 else None) 

Nó sử dụng FileInput lớp để tránh tình trạng toàn cầu.

Ví dụ:

$ echo 'äöüß' | python toascii.py utf-8 
aouss 
Các vấn đề liên quan