2010-11-15 50 views
20

Dưới đây là chương trình thử nghiệm, trong đó có một nhân vật Trung Quốc:python: json.dumps không thể xử lý utf-8?

# -*- coding: utf-8 -*- 
import json 

j = {"d":"中", "e":"a"} 
json = json.dumps(j, encoding="utf-8") 

print json 

Dưới đây là kết quả, nhìn json.dumps chuyển đổi utf-8 để những con số ban đầu!

{"e": "a", "d": "\u4e2d"} 

Tại sao điều này bị hỏng? Hoặc bất cứ điều gì tôi sai?

+8

trước hết là: __don't tên var bạn json__ bạn sẽ không thể truy cập json lib nữa sau đó, thứ hai của tất cả không có gì là bị hỏng, bên cạnh mã hóa json mặc định là utf-8, do đó bạn không cần phải thêm nó trong dumps() args. – mouad

+0

nếu tôi có thể chấp nhận nó để chuyển dữ liệu nhị phân utf-8 thành "\ u4e2d", làm thế nào tôi có thể chuyển đổi nó trở lại thành utf-8 nhị phân trong javascript, đó là khách hàng nhận dữ liệu này? –

+0

bạn đã thử chưa?, Tôi muốn gửi nó như thế cho trình duyệt, tôi nghĩ nếu bạn đang sử dụng một javascript tinh vi, nó sẽ biết phải làm gì với nó. – mouad

Trả lời

27

Bạn nên đọc json.org. Đặc tả JSON hoàn chỉnh nằm trong hộp màu trắng ở bên phải.

Không có gì sai với JSON được tạo. Máy phát điện được phép tạo ra chuỗi UTF-8 hoặc chuỗi ASCII thuần tuý, trong đó các ký tự được thoát với ký hiệu \uXXXX. Trong trường hợp của bạn, mô-đun Python json đã quyết định thoát và có ký hiệu đã thoát là \u4e2d.

Nhân tiện: Bất kỳ trình thông dịch JSON phù hợp nào cũng sẽ không hiển thị lại chuỗi này một cách chính xác và trả lại cho bạn ký tự thực.

58

Có vẻ như JSON hợp lệ đối với tôi. Nếu bạn muốn json xuất một chuỗi có ký tự không phải ASCII, bạn cần phải vượt qua ensure_ascii=False và sau đó mã hóa theo cách thủ công sau đó.

+2

Đây là câu trả lời đã giúp tôi !! – borrrden

+1

Tài liệu: http://docs.python.org/2/library/json.html#basic-usage –

5

Sử dụng simplejson với các tùy chọn được đề cập:

# -*- coding: utf-8 -*- 
import simplejson as json 

j = {"d":"中", "e":"a"} 
json = json.dumps(j, ensure_ascii=False, encoding="utf-8") 

print json 

Outs:

{"e": "a", "d": "中"}