2009-12-16 35 views
5

Tôi có một tính năng của chương trình của tôi, nơi người dùng có thể tải lên tệp csv, chương trình của tôi đi qua và sử dụng làm đầu vào. Tôi có một người sử dụng phàn nàn về một vấn đề mà đầu vào của ông là ném lên một lỗi. Lỗi là do nguyên nhân bất hợp pháp được mã hóa sai. Các ký tự bên dưới:Làm thế nào để khử trùng hoàn toàn một chuỗi ký tự không hợp lệ trong python?

Đôi khi nó xuất hiện dưới dạng kim cương có dấu "?" ở giữa. Đôi khi nó xuất hiện như một viên kim cương đôi với "?" ở giữa, đôi khi nó xuất hiện dưới dạng "\ xa0" và đôi khi nó xuất hiện dưới dạng "\ xa0 \ xa0".

Trong chương trình của tôi nếu tôi làm:

print str_with_weird_char 

các striong sẽ hiển thị trong thiết bị đầu cuối của tôi với viên kim cương "?" thay cho nhân vật kỳ lạ. Nếu tôi sao chép + dán chuỗi đó vào ipython, nó sẽ thoát với thông báo này:

In [1]: g="blah��blah" 
WARNING: 
******** 
You or a %run:ed script called sys.stdin.close() or sys.stdout.close()! 
Exiting IPython! 

để ý kim cương "?" bây giờ là gấp đôi. Đối với một số lý do copy + paste làm cho nó tăng gấp đôi ...

Trong trang django traceback, nó trông như thế này:

UnicodeDecodeError at /chris/import.html 
('ascii', 'blah \xa0 BLAH', 14, 15, 'ordinal not in range(128)') 

Điều mà messes tôi là tôi không thể làm bất cứ điều gì với điều này chuỗi mà không có nó ném một exceotion. Tôi đã thử unicode(), tôi đã cố gắng str(), tôi đã thử .encode(), tôi đã thử .encode ("utf-8"), không có vấn đề gì nó ném lên một lỗi.

Tôi có thể làm gì để làm cho chuỗi này hoạt động?

+0

Nhân tiện, lý do bạn "không thể làm bất cứ điều gì" với nó có lẽ là vì tất cả những điều bạn đã thử liên quan đến việc nhập biểu thức tại dấu nhắc. Trình thông dịch tương tác hiển thị kết quả của mỗi biểu thức bằng cách gọi repr() trên đó. Đôi khi điều đó dẫn đến giải mã các lỗi vì bàn điều khiển của bạn không xử lý Unicode (hoặc các lý do khác?). Nếu bạn nhận được một điều như vậy, hãy thử gán nó cho một tên giả (ví dụ: "x = foo" thay vì chỉ "foo") và điều đó thường sẽ không hiển thị ngoại lệ. Sau đó, bạn biết ngoại lệ là giả mạo. –

Trả lời

6

Bạn có thể vượt qua, "bỏ qua" để bỏ qua ký tự không hợp lệ trong .encode/.decode như "ILLEGAL".decode("utf8","ignore")

>>> "ILLEGA\xa0L".decode("utf8") 
... 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 6: unexpected code byte 

>>> "ILLEGA\xa0L".decode("utf8","ignore") 
u'ILLEGAL' 
>>> 
2

Khai báo mã hóa trên dòng thứ hai của kịch bản của bạn. Nó thực sự phải là thứ hai. Giống như

#!/usr/bin/python 
# coding=utf-8 

Điều này có thể đủ để tự giải quyết vấn đề của bạn. Nếu không, hãy xem str.encode ('utf-8') và str.decode ('utf-8').

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