2011-06-27 17 views
5

Đây là vấn đề của tôi, tôi có một biến mã hóa sai mà tôi muốn sửa chữa. câu chuyện dài ngắn, tôi kết thúc với:mã hóa python chuyển đổi

myVar=u'\xc3\xa9' 

đó là sai bởi vì đó là nhân vật 'é' hoặc \u00e9 UTF-8 mã hóa, không unicode.

Không có sự kết hợp mã hóa/giải mã nào mà tôi cố gắng giải quyết vấn đề. Tôi nhìn về phía đối tượng bị cắt xén, nhưng bạn phải cung cấp một mã hóa, và rõ ràng là không ai trong số họ phù hợp.

Về cơ bản tôi cần diễn giải lại mảng byte thành mã hóa chính xác. Bất kỳ ý tưởng về cách làm điều đó? Cảm ơn.

+1

UTF-8 là unicode. –

+0

Bạn muốn kết thúc bằng gì, unicode hoặc str? – pajton

+1

@ X-Istence: nope unicode là * số * đứng cho một ký tự, trong khi UTF-8 là * mã hóa * cho số đó (chẳng hạn như UTF-16, UTF-32 ...) – gregseth

Trả lời

5

Điều bạn nên làm.

>>> b='\xc3\xa9' 
>>> b 
'\xc3\xa9' 
>>> b.decode("UTF-8") 
u'\xe9' 

Vì bạn không hiển thị mã bị hỏng gây ra sự cố, tất cả những gì chúng tôi có thể làm là làm cho vấn đề phức tạp phức tạp hơn.

Điều này dường như là những gì bạn đang thấy.

>>> c 
u'\xc3\xa9' 
>>> c.decode("UTF-8") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 

Đây là giải pháp thay thế.

>>> [ chr(ord(x)) for x in c ] 
['\xc3', '\xa9'] 
>>> ''.join(_) 
'\xc3\xa9' 
>>> _.decode("UTF-8") 
u'\xe9' 

Sửa mã đã tạo ra nội dung không đúng để bắt đầu.

+0

Vâng tôi biết những gì cần phải được thực hiện, và rằng sửa chữa nguồn gốc của vấn đề là giải pháp tốt nhất. Nhưng tôi đang ở trong một tình huống mà tôi không thể, vì vậy tôi sẽ lấy workaroud, đó chính là điều tôi muốn. Cảm ơn. – gregseth

+0

Có vẻ như 'c.encode ('iso-8859-15'). Giải mã ('utf-8'). Mã hóa ('utf-8')' cũng hoạt động. Tôi có trong trường hợp đặc biệt không? – gregseth

+0

@gregseth: Không. Nhiều mã hóa chồng lên nhau. Điểm UTF-8 trông giống như ASCII đối với hầu hết các ký tự ASCII chuẩn. Tôi không biết ý bạn là "công trình" trong bình luận đó, vì không có điểm nào trong việc giải mã để tạo Unicode theo sau và mã hóa để tạo lại các byte một lần nữa. Mã Python hoạt động trong Unicode. Giai đoạn. Các tệp bên ngoài được mã hóa (trên đầu ra) và được giải mã (trên đầu vào). Không có cách nào khác để mã hóa và giải mã ngoại trừ tệp I/O. –

1

Giải pháp hacky: kéo các điểm mã bằng ord, sau đó xây dựng các ký tự (chiều dài một chuỗi) ra khỏi số này với chr, sau đó dán lô lại với nhau và giải mã.

>>> u = u'\xc3\xa9' 
>>> s = ''.join(chr(ord(c)) for c in u) 
>>> unicode(s, encoding='utf-8') 
u'\xe9'