2015-11-22 62 views
2

當我試圖通過解碼和再次編碼來分隔兩個Unicode字符時,我沒有得到相同的Unicode作爲回報,但我得到了不同的Unicode。解碼編碼UTF-8不會導致原始的unicode

附加是我嘗試這樣做時的回答。

>>> s ='\xf0\x9f\x93\xb1\xf0\x9f\x9a\xac' 
>>> u = s.decode("utf-8") 
>>> u 
u'\U0001f4f1\U0001f6ac' 
>>> u[0].encode("utf-8") 
'\xed\xa0\xbd' 
>>> u[1].encode("utf-8") 
'\xed\xb3\xb1' 
>>> u[0] 
u'\ud83d' 
>>> u[1] 
u'\udcf1' 
+0

你的UTF-8字符串這兩個字符編碼'u.encode('utf-8')'給你原來的字節 – saulspatz

+0

@Harwee對我來說工作正常--linux,python 2.7.10 – furas

+0

@furas在Mac上用python 2.7.10,我得到的結果與日e OP – saulspatz

回答

5

你的Python的版本使用UCS-2(每個字符16個比特),但這些特定的Unicode字符需要32位,所以ü的元素表示一個字符的「半」。 u.encode('utf-8')正常工作,因爲它理解編碼。 (通過此解碼器:http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder

;

U+1F6AC SMOKING SYMBOL character(&#x1F6AC);

U+1F4F1 MOBILE PHONE character(&#x1F4F1):

+1

爲了記錄,在python 3.5中,即使在我的Mac上,一切正常。 – saulspatz

+0

我可以確認我的python是使用UCS-2編譯的,如果使用UCS-4時它會起作用,它會恢復原狀。 – Harwee

+0

@saulspatz作爲Python 3.3 Unicode碼點永遠不會被拆分爲UTF-16。參見[PEP 0393](https://www.python.org/dev/peps/pep-0393/)。 –