2016-06-28 19 views
6

Tôi đang sử dụng Python 3.5 và tôi đang cố gắng lấy một khối văn bản byte có thể hoặc không chứa các ký tự đặc biệt của Trung Quốc và xuất nó vào một tệp. Nó hoạt động cho các mục không chứa các ký tự tiếng Trung, nhưng sẽ bị ngắt khi thực hiện. Các ký tự Trung Quốc luôn là tên của một người, và luôn luôn bổ sung cho chính tả tiếng Anh của tên của họ. Văn bản được định dạng JSON và cần phải được giải mã trước khi tôi có thể tải nó. Việc giải mã có vẻ ổn và không cho tôi bất kỳ lỗi nào. Khi tôi cố gắng và viết văn bản giải mã vào một tập tin nó mang lại cho tôi thông báo lỗi sau:Vấn đề giải mã Python với các ký tự tiếng Trung

UnicodeEncodeError: 'charmap' codec can't encode characters in position 14-18: character maps to undefined

Dưới đây là một ví dụ về các dữ liệu thô mà tôi nhận được trước khi tôi làm bất cứ điều gì với nó:

b' "isBulkRecipient": "false",\r\n  "name": "Name in, English \xef' 
b'\xab\x62\xb6\xe2\x15\x8a\x8b\x8a\xee\xab\x89\xcf\xbc\x8a",\r\n 

đây là mã mà tôi đang sử dụng:

recipientData = json.loads(recipientContent.decode('utf-8', 'ignore')) 
recipientName = recipientData['signers'][0]['name'] 
pprint(recipientName) 
with open('envelope recipient list.csv', 'a', newline='') as fp: 
    a = csv.writer(fp, delimiter=',') 
    csvData = [[recipientName]] 
    a.writerows(csvData) 

các recipientContent được lấy từ một cuộc gọi API. Tôi không cần phải có các ký tự Trung Quốc trong tập tin đầu ra. Bất kỳ lời khuyên nào sẽ được đánh giá cao!

Cập nhật:

Tôi đã làm một số cách giải quyết dẫn sử dụng cho mỗi mục mà phá vỡ, và đến mục khác mà không chứa các ký tự đặc biệt Trung Quốc, nhưng đã có chúng từ các ngôn ngữ khác, và đã phá vỡ chương trình như tốt. Các ký tự đặc biệt chỉ có trong trường tên. Vì vậy, một cái tên có thể là một cái gì đó giống như "Ałex", nơi nó là một hỗn hợp của các nhân vật bình thường và đặc biệt. Trước khi tôi giải mã chuỗi chứa thông tin này, tôi có thể in ra màn hình và có vẻ như sau: b'name": "A\xc5ex",\r\n

Nhưng sau khi tôi giải mã nó thành utf-8 nó sẽ cho tôi lỗi nếu tôi cố gắng xuất nó. Thông báo lỗi là: UnicodeEncodeError: 'charmap' codec can't encode character 'u0142' in position 2- character maps to -undefined-

Tôi đã tra cứu những gì \ u0142 và đó là ký tự đặc biệt ł.

+0

Chuỗi ví dụ không xuất hiện để được UTF-8 (hay bất kỳ multibyte chung Trung Quốc mã hóa). Bạn có chắc là mã UTF-8 được mã hóa (hoặc thậm chí là tiếng Trung Quốc) không? – univerio

+0

bạn phải kiểm tra 'Loại nội dung'. Nếu đó là 'application/json; charset = utf-16', sử dụng 'utf-16'. Mặc định cho 'application/json' là' utf-8' –

+0

Tôi không chắc chắn 100% rằng utf-8 của nó bởi vì dịch vụ web im nhận dữ liệu từ không có tài liệu rất tốt, nhưng tôi đã thử một số các loại mã hóa khác nhau, bao gồm utf-16. Tôi chắc chắn rằng nó có chứa các ký tự Trung Quốc. –

Trả lời

0

Cảnh báo: giải pháp shotgun trước

Giả sử bạn chỉ muốn thoát khỏi tất cả nhân vật nước ngoài trong tất cả các tập tin của bạn (có nghĩa là họ không quan trọng cho việc xử lý tương lai của bạn của tất cả các lĩnh vực khác), bạn có thể đơn giản bỏ qua tất cả các ký tự không ascii

recipientData = json.loads(recipientContent.decode('utf-8', 'ignore')) 

bởi

recipientData = json.loads(recipientContent.decode('ascii', 'ignore')) 

như thế này bạn loại bỏ tất cả các ch ascii phi aracters trước khi xử lý trong tương lai.

Tôi gọi nó là giải pháp shotgun vì nó có thể không hoạt động chính xác trong những tình huống nhất định:

  1. Rõ ràng nếu ký tự ascii không là cần thiết để giữ cho lần sử dụng sau
  2. Nếu b'\' hoặc b" nhân vật xuất hiện ví dụ từ phần của một ký tự utf-16.
0

Lỗi bạn nhận được là khi bạn đang ghi vào tệp.

Trong Python 3.x, khi bạn open() ở chế độ văn bản (mặc định) mà không chỉ định encoding=, Python sẽ sử dụng mã hóa phù hợp nhất với cài đặt ngôn ngữ hoặc ngôn ngữ của bạn.

Nếu bạn đang sử dụng Windows, điều này sẽ sử dụng codec charmap để ánh xạ tới mã hóa ngôn ngữ của bạn.

Mặc dù bạn chỉ có thể viết các byte thẳng vào một tệp, bạn đang làm đúng việc bằng cách giải mã nó trước tiên. Như những người khác đã nói, bạn thực sự nên giải mã bằng cách sử dụng mã hóa được chỉ định bởi máy chủ web. Bạn cũng có thể sử dụng mô-đun Yêu cầu Python, thực hiện điều này cho bạn. (Ví dụ bạn không giải mã là UTF-8, vì vậy tôi cho rằng ví dụ của bạn không chính xác)

Để giải quyết lỗi ngay lập tức của bạn, chỉ cần chuyển một số encoding đến open(), hỗ trợ các ký tự bạn có trong dữ liệu của mình. Unicode trong mã hóa UTF-8 là sự lựa chọn hiển nhiên. Vì vậy, bạn nên thay đổi mã của bạn để đọc:

with open('envelope recipient list.csv', 'a', encoding='utf-8', newline='') as fp: 
0

Thêm dòng này vào mã của bạn:

from __future__ import unicode_literals 
+0

Tại sao điều đó lại hữu ích? –

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