2015-02-16 15 views
7

Tôi chỉ đang cố gắng giải mã chuỗi \ uXXXX \ uXXXX \ uXXXX. Nhưng tôi gặp lỗi:UnicodeEncodeError: codec 'ascii' không thể mã hóa các ký tự ở vị trí 0-5: thứ tự không nằm trong phạm vi (128)

$ python 
Python 2.7.6 (default, Sep 9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print u'\u041e\u043b\u044c\u0433\u0430'.decode('utf-8') 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/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-4: ordinal not in range(128) 

Tôi là người mới Python. Vấn đề là gì? Cảm ơn!

+0

Tại sao bạn muốn ** giải mã ** dữ liệu đã giải mã? –

+0

Vấn đề là bạn đang sử dụng Python 2, nơi có phương pháp lừa dối '.decode' có sẵn trên chuỗi Unicode. Sử dụng 'python3' và vấn đề kỳ diệu biến mất, như' u ''. Decode' sẽ gây ra 'AttributeError: 'str' đối tượng không có thuộc tính 'decode'' thay thế. –

Trả lời

14

Python đang cố gắng hữu ích. Bạn không thể giải mã dữ liệu Unicode, nó đã được giải mã. Vì vậy, Python đầu tiên sẽ mã hóa dữ liệu (sử dụng codec ASCII) để nhận byte để giải mã. Mã hóa ngầm này không thành công.

Nếu bạn có dữ liệu Unicode, nó chỉ có ý nghĩa để mã hóa sang UTF-8, không giải mã:

>>> print u'\u041e\u043b\u044c\u0433\u0430' 
Ольга 
>>> u'\u041e\u043b\u044c\u0433\u0430'.encode('utf8') 
'\xd0\x9e\xd0\xbb\xd1\x8c\xd0\xb3\xd0\xb0' 

Nếu bạn muốn có một giá trị Unicode, sau đó sử dụng một Unicode chữ (u'...') là tất cả bạn cần làm. Không cần giải mã thêm nữa.

Chuyển đổi ẩn tương tự diễn ra theo một hướng khác; nếu bạn cố gắng mã hóa một dấu kiểm cách xác thực, bạn sẽ kích hoạt giải mã ẩn:

>>> u'\u041e\u043b\u044c\u0433\u0430'.encode('utf8').encode('utf8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128) 
+0

Thực ra tôi sử dụng 'msg = msg + u" @ id% s (% s) \ n "% (u [" id "], u [" first_name "]. Mã hóa ('utf8')) ' và 'in mã msg'. Và nó cho tôi một lỗi trong mệnh đề 'print'. –

+0

@SergiiMatrunchyk: Đó không phải là câu hỏi của bạn. Thiết bị đầu cuối hoặc bảng điều khiển của bạn có được định cấu hình chính xác để xử lý các ký tự mà bạn đang cố gắng in không? –

+0

@SergiiMatrunchyk: Ngoài ra, tại sao bạn * mã hóa * sau đó nội suy thành một chuỗi unicode? Bạn đang đặt những giá trị đó vào một đối tượng unicode 'u '...'', bạn không nên mã hóa các giá trị mà bạn đang nội suy. –

9

bạn có thể đặt mã hóa mặc định là utf-8.

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
+3

Ý tưởng tồi. Đó là một bản hack khó chịu, khó chịu cho những người không hiểu mã hóa: https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code/ –

+0

Cảm ơn Alastair McCormack vì đề xuất của bạn –

+2

Do ** not ** sử dụng giải pháp [cult cult] (https://en.wikipedia.org/wiki/Cargo_cult_programming). 'sys.setdefaultencoding' được loại bỏ khỏi mô-đun vì một lý do, việc thay đổi mã hóa mặc định ngầm của Python 2 có thể phá vỡ các thư viện của bên thứ ba dựa vào hành vi bình thường. –

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