Tôi đang gặp sự cố khi lưu và xuất một ký tự ndash như UTF-8 ở Django.Django đôi có mã hóa chuỗi Unicode (utf-8?) Không?
Tôi đang nhận dữ liệu từ API. Ở dạng thô, như lấy ra và xem trong một trình soạn thảo văn bản, do đơn vị dữ liệu có thể tương tự như:
"I love this detergent \u2013 it is so inspiring."
(\ u2013 là & ndash; như một thực thể html).
Nếu tôi nhận được điều này trực tiếp từ một API và hiển thị nó ở Django, không có vấn đề gì. Nó hiển thị trong trình duyệt của tôi như một dấu gạch ngang dài. Tôi nhận thấy tôi phải làm decode('utf-8')
để tránh các "'ascii' codec không thể mã hóa ký tự" lỗi nếu tôi cố gắng để làm một số hoạt động với văn bản đó trong quan điểm của tôi, mặc dù. Các văn bản sẽ đi đến mẫu là "Tôi yêu chất tẩy rửa này \ u2013 nó rất cảm hứng.", Theo Thanh công cụ gỡ lỗi Django.
Khi được lưu trữ để MySQL và đọc cho đầu ra thông qua quan điểm tương tự và mẫu, tuy nhiên, nó sẽ trông như
"I love this detergent – it is so inspiring"
bảng MySQL của tôi được thiết lập để DEFAULT CHARSET=utf8
.
Bây giờ, khi tôi đọc dữ liệu từ cơ sở dữ liệu thông qua màn hình MySQL trong một thiết bị đầu cuối thiết lập để UTF-8, nó xuất hiện như
"I love this detergent – it is so inspiring"
(đúng - cho thấy một ndash)
Khi tôi sử dụng mysqldb trong một vỏ python, dòng này là
"I love this detergent \xe2\x80\x93 it is so inspiring"
(đây là UTF-8 chính xác cho ndash)
Tuy nhiên, nếu tôi chạy python manage.py shell
, và sau đó
In [1]: import myproject.myapp.models ThatTable
In [2]: msg=ThatTable.objects.all().filter(thefield__contains='detergent')
In [3]: msg
Out[4]: [{'thefield': 'I love this detergent \xc3\xa2\xe2\x82\xac\xe2\x80\x9c it is so inspiring'}]
Nó xuất hiện với tôi rằng Django đã \xe2\x80\x93
để có nghĩa là ba nhân vật riêng biệt, và mã hóa nó như là UTF-8 vào \xc3\xa2\xe2\x82\xac\xe2\x80\x9c
. Điều này hiển thị là “vì \ xe2 dường như là â, \ x80 có vẻ là €, v.v. Tôi đã kiểm tra và điều này cũng là là cách thức nó được gửi tới mẫu.
Nếu bạn giải mã chuỗi dài trong Python, mặc dù, với decode('utf-8')
, kết quả là \xe2\u20ac\u201c
cũng hiển thị trong trình duyệt dưới dạng â € “. Cố gắng giải mã nó một lần nữa mang lại một UnicodeDecodeError.
Tôi đã theo dõi Django suggestions for Unicode, theo như tôi biết (được định cấu hình MySQL).
Bất kỳ đề xuất nào về những gì tôi có thể đã định cấu hình sai?
phụ lục Có vẻ như vấn đề này cùng đã nảy sinh trong các lĩnh vực khác hoặc hệ thống là tốt., Như khi tìm kiếm \ xc3 \ xa2 \ xe2 \ x82 \ xac \ xe2 \ x80 \ x9c, tôi thấy ở http://pastie.org/908443.txt một kịch bản để 'sửa chữa các thực thể UTF8 xấu.', cũng được tìm thấy trong một trình cắm nhập RSS wordpress. Nó đơn giản thay thế trình tự này bằng –. Tôi muốn giải quyết điều này đúng cách, mặc dù!
Ồ, và tôi đang sử dụng Django 1.2 và Python 2.6.5.
Tôi có thể kết nối với cùng một cơ sở dữ liệu với PHP/PDO và in ra dữ liệu này mà không thực hiện bất kỳ điều gì đặc biệt và có vẻ ổn.
Thật kỳ lạ, nhưng gọi 'tên đặt utf8' làm cho vấn đề trở nên tồi tệ hơn. Để lại Django ra khỏi hình ảnh, trong một vỏ Python, nó làm cho nhân vật đó là '\ xc3 \ xa2 \ xe2 \ x82 \ xac \ xe2 \ x80 \ x9c'. sau đó nếu tôi gọi 'set name latin1', ký tự trở thành' \ xe2 \ x80 \ x93'. Trong PHP, nó đi từ â € “đến à ¢ â 'â € œ. Vì vậy, việc đặt nó thành latin1 thực sự làm cho nó hoạt động tốt trong PHP. Tôi khá chắc chắn rằng Django gọi 'đặt tên utf8' để chuẩn bị kết nối, thực sự. – JAL
Aha, có vẻ như tôi cần gọi 'set name' trước khi chèn dữ liệu. – JAL
Chèn dữ liệu vào php, nghĩa là. Tôi sẽ tiếp tục và chấp nhận câu trả lời của bạn (mặc dù tôi cần lưu ý cho người đọc trong tương lai, giải pháp là gọi 'set names utf8' cho kết nối PHP, không phải là tên Python) – JAL