2015-07-07 27 views
8

Tôi có chương trình Python 2.7 đọc tin nhắn văn bản iOS từ cơ sở dữ liệu SQLite. Các tin nhắn văn bản là các chuỗi unicode. Trong tin nhắn văn bản sau đây:Python - Đọc Ký tự Unicode Biểu tượng cảm xúc

u'that\u2019s \U0001f63b' 

Các dấu nháy đơn được thể hiện bằng \u2019, nhưng biểu tượng cảm xúc được thể hiện bằng \U0001f63b. Tôi đã tra cứu điểm mã cho biểu tượng cảm xúc được đề cập đến, và là \uf63b. Tôi không chắc chắn nơi xuất hiện của 0001. Tôi biết rất ít về mã hóa ký tự.

Khi tôi in văn bản, từng ký tự, sử dụng: Chương trình

s = u'that\u2019s \U0001f63b' 

for c in s: 
    print c.encode('unicode_escape') 

Các xuất ra như sau:

t 
h 
a 
t 
\u2019 
s 

\ud83d 
\ude3b 

Làm thế nào tôi có thể đọc một cách chính xác những ký tự cuối cùng trong Python? Tôi có sử dụng mã hóa chính xác ở đây không? Tôi chỉ nên cố gắng để thùng rác những người 0001 s trước khi đọc nó, hoặc là có một cách dễ dàng hơn, ít ngớ ngẩn?

+0

'0xf63b' nằm trong phần" Sử dụng riêng tư "của Unicode. Bạn có chắc chắn điều này là chính xác? Codepoint của bạn có lẽ là '0x1f63b', vì đó là biểu tượng cảm xúc" cười với mắt trái tim ". – Kupiakos

+0

Làm cách nào để bạn xác định rằng '\ uf63b' sẽ là ký tự Emoji? Theo tài liệu tham khảo của tôi, nó không được xác định: http://www.fileformat.info/info/unicode/char/f63b/index.htm –

Trả lời

17

Tôi không nghĩ rằng bạn đang sử dụng mã hóa chính xác, cũng như bạn không cần. Những gì bạn có là một chuỗi unicode hợp lệ với một chuỗi gồm 4 chữ số và 8 chữ số thoát. Hãy thử điều này trong REPL trên, nói rằng, OS X

>>> s = u'that\u2019s \U0001f63b' 
>>> print s 
that’s 

Trong python3, mặc dù -

Python 3.4.3 (default, Jul 7 2015, 15:40:07) 
>>> s = u'that\u2019s \U0001f63b' 
>>> s[-1] 
'' 
+0

Vâng bạn sẽ nhìn vào điều đó ... Tôi thực sự không biết gì về không có gì. Cảm ơn! Tôi vẫn chưa rõ cách đọc nhân vật cuối cùng đó. s [-1] và s [-2] vẫn cho '\ ud83d' và '\ ude3b'. Có cách nào để đọc ký tự chuỗi ký tự không? –

+1

@alaprise bạn đang thấy một tạo phẩm về cách Python lưu trữ chuỗi Unicode của nó trong nội bộ. Nếu bạn đã làm điều tương tự trong Python 3 bạn sẽ thấy một cái gì đó hoàn toàn khác nhau. –

+2

@alaprise Câu trả lời khác có một số thông tin tốt, trong đó tóm tắt là 'nếu có thể chuyển sang Python3'. Nếu không, bạn đang bước vào thế giới của các cặp/cặp/cặp thay thế mà bạn không muốn biết vì chúng là bài hát của Cthulhu – pvg

3

phần cuối cùng của bạn về sự nhầm lẫn có thể do thực tế là bạn đang chạy những gì được gọi là một " xây dựng Python hẹp ". Python không thể giữ một ký tự đơn với đủ thông tin để giữ một biểu tượng cảm xúc duy nhất. Giải pháp tốt nhất là chuyển sang Python 3. Nếu không, hãy thử xử lý UTF-16 surrogate pair.

+0

'regex.findall (r '\ X', unicode_text)' có thể được sử dụng để lấy các ký tự "người dùng nhận biết" có thể mở rộng hơn một codepoint Unicode (nó không liên quan đến các cặp thay thế nhưng nó sẽ khắc phục vấn đề như một bên hiệu ứng). – jfs

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