5

Tôi có một văn bản chứa các ký tự như "\ xaf", "\ xbe", như tôi hiểu từ this question, là các ký tự được mã hóa ASCII.Làm cách nào để chuyển đổi các ký tự được mã hóa xXY sang UTF-8 bằng Python?

Tôi muốn chuyển đổi chúng bằng Python sang các tương đương UTF-8 của chúng. Thông thường string.encode("utf-8") ném UnicodeDecodeError. Có cách nào tốt hơn không, ví dụ: với thư viện chuẩn codecs?

Mẫu 200 characters here.

+0

mẫu của bạn không bao gồm bất kỳ '\ xaf' hoặc như thế. Bạn có mẫu nào với các ký tự như vậy không? – dkarp

+0

Dữ liệu mẫu của bạn * là * hợp lệ UTF-8. Với ký tự điều khiển "dấu phân tách bản ghi" và "dấu phân tách đơn vị". – dan04

+0

Theo 'enca' (http://linux.die.net/man/1/enca) nó là UTF-8" được bao quanh bởi/trộn lẫn với dữ liệu không phải văn bản ". –

Trả lời

2

Tệp của bạn đã là tệp được mã hóa UTF-8.

# saved encoding-sample to /tmp/encoding-sample 
import codecs 
fp= codecs.open("/tmp/encoding-sample", "r", "utf8") 
data= fp.read() 

import unicodedata as ud 

chars= sorted(set(data)) 
for char in chars: 
    try: 
     charname= ud.name(char) 
    except ValueError: 
     charname= "<unknown>" 
    sys.stdout.write("char U%04x %s\n" % (ord(char), charname)) 

Và tự điền vào tên vô danh:
char U000a ĐƯỜNG DÂY FEED
char THÔNG TIN U001e SEPARATOR HAI
char THÔNG TIN U001f SEPARATOR ONE

+0

Cảm ơn, bạn đúng mẫu mà tôi đã cung cấp là UTF-8. Tuy nhiên (không may) trong toàn bộ tập tin, có các phần được mã hóa trong các mã hóa khác nhau (chủ yếu là windows-1250). Tôi đã giải quyết điều này bằng 'try'ing to' "string".giải mã() 'cho các mã hóa phổ biến nhất và, nếu mọi thứ thất bại, hãy đoán mã hóa bằng thư viện' chardet'. –

2

Không phải ASCII (mã ASCII chỉ lên tới 127; \xaf là 175). Trước tiên, bạn cần phải tìm hiểu mã hóa chính xác, giải mã và sau đó mã hóa lại bằng UTF-8.

Bạn có thể cung cấp mẫu chuỗi thực tế không? Sau đó, chúng tôi có thể đoán mã hóa hiện tại.

+0

Tôi đã chỉnh sửa câu hỏi để thêm liên kết vào một mẫu ngắn. –

+0

Mẫu đó không giống như một văn bản được mã hóa với tôi, giống như một định dạng độc quyền. –

+0

Nó phải ở định dạng MARC (http://www.loc.gov/marc/). Khi tôi cố gắng để phát hiện mã hóa của nó với 'enca' tôi nhận được phản hồi nói rằng nó chủ yếu là UTF-8 xen kẽ với các ký tự không phải văn bản. –

3

.encode là để chuyển đổi một chuỗi Unicode (unicode trong 2.x, 3.x str trong) vào một một chuỗi byte (str trong 2.x, 3.x bytes trong).

Trong 2.x, hợp pháp để gọi .encode trên đối tượng str. Python ngầm giải mã chuỗi thành Unicode trước tiên: s.encode(e) hoạt động như thể bạn đã viết s.decode(sys.getdefaultencoding()).encode(e).

Sự cố là mã hóa mặc định là "ascii" và chuỗi của bạn chứa ký tự không phải ASCII. Bạn có thể giải quyết điều này bằng cách chỉ định rõ ràng mã hóa chính xác.

>>> '\xAF \xBE'.decode('ISO-8859-1').encode('UTF-8') 
'\xc2\xaf \xc2\xbe' 
+0

Tốt nhưng phần còn lại của văn bản được mã hóa dưới dạng UTF-8 (ít nhất điều này được báo cáo bằng 'enca'). Vì vậy, thủ tục này không thể được áp dụng cho toàn bộ văn bản. –

+2

Vì vậy, các ký tự \ xXY nằm trong ISO-8859-1? –

Các vấn đề liên quan