Python3中如何得到Unicode碼對應的中文?

1.已經知道這種情況:

2.在爬取知乎專欄文章時,response的內容是json格式的,print(response.read().decode("utf-8"))輸出得中文部分都是以Unicode碼錶示的(就像上圖中的s);用BeautifulSoup 提取response的text,然後用print()輸出,結果還是Unicode碼,print(text)為什麼不像1中那樣輸出對應中文呢?那要怎樣才能輸出對應的中文呢?

輸出結果:

3.可以用json.loads(resp.read().decode("utf-8"))將response轉化成字典,那樣上述Unicode碼也就顯示為中文了,但這樣就不能用BeautifulSoup了。


先檢查text是什麼類型

如果type(text) is bytes,那麼

text.decode("unicode_escape")

如果type(text) is str,那麼

text.encode("latin-1").decode("unicode_escape")


2015-05-31
Ongoing-Study/ucps.py at master · myd7349/Ongoing-Study · GitHub
----
2015-06-03
我之前貼的代碼具有誤導性。因為我的代碼實際上是在 raw string literal 和 str 轉換。即:
ucps_to_str(r"u8bf7") # 注意這裡是一個 raw string literal,即實際上不是 "u8bf7" 而是 "\u8bf7"
-&>

對不起!

如果是 Python 3,我贊同 @竺夏棟 的回答:先看一下 text 的 type。如果是 str,應該是不需要轉碼(Python documentation: Textual data in Python is handled with str objects, or strings. Strings are immutable sequences of Unicode code points.)。如果是 bytes,則轉之。

&>&>&> "u8bf7"
"請"
&>&>&> b"u8bf7"
b"\u8bf7"
&>&>&> b"u8bf7".decode("unicode-escape")
"請"
&>&>&> b"u8bf7".decode("unicode_escape")
"請"
&>&>&> r"u8bf7" # 我寫的腳本是處理這種情況的
"\u8bf7"
&>&>&> ucps_to_str(r"u8bf7")
"請"
&>&>&> "請".encode("unicode-escape")
b"\u8bf7"
&>&>&> _.decode("unicode-escape")
"請"

--


先確定變數類型為str

然後

if "\u" in b:
b=b.encode("utf-8").decode("unicode_escape")


print即可


我也來答一發。
我和題主遇到的問題估計是一樣的。
具體什麼情況呢?

我們採集一個網頁,但是呢,網頁有時候編碼是混碼,這就造成了python 3+的陣痛。

什麼是混碼呢?

就是網頁的源代碼一部分是Unicode編碼,一部分是其他格式的編碼,造成了在網頁內容decode()的時候,一部分沒正確解碼。「你別管人家網頁是怎麼正確顯示的,反正在我們程序內部顯示不正確,輸出也不正確」

什麼是python 3+的陣痛呢?

混碼一直是各種編程的陣痛。。。。。

python 3+之後的版本,無論輸入輸出是什麼格式,中間轉接的都是Unicode格式。在python運行時,自動給你轉到Unicode,輸出的時候再轉一遍換成需要的輸出格式。
比如你輸入的時候是漢字,python內部的過程是 "請"→"u8bf7"→"請"。
那麼在網頁中你截取的是"請"字,輸出沒什麼問題,也是輸出"請"
如果你在網頁中截取的是["u8bf7", "不", "要"],那麼你的輸出也是"u8bf7"

但是呢,其實你想截取 "u8bf7" , 輸出 "請" 字。

python中"u8bf7"的編碼是什麼呢? → "\u8bf7"

比如我在網頁中re出來的

圖中第二行 "u51acu5b63u7684"....... 等等吧,它的格式是&
我想要的是什麼呢?
是 "冬季的美麗很少人" 這樣的漢字。

為什麼呢?

因為圖中第二行 "u51acu5b63u7684" 在python的中間層中的編碼是 "\u51ac\u5b63\u7684" ,輸出的時候解碼、轉碼都是轉成 "u51acu5b63u7684" ,也就造成了我們無法得到我們想要的結果。

處理方法上面的Karma、myd7349 都給出了處理方法,那就是

text.encode("latin-1").decode("unicode_escape")

對於部分字元串是混合編碼的,我是這樣處理的:

if photo_discribe.startswith("\u"):
#print(type(photo_discribe))
#print(photo_discribe)
photo_discribe = photo_discribe.encode("latin-1").decode("unicode_escape")
#print(photo_discribe)

哈哈哈哈哈,我是在給伸手黨提供代碼。


如圖……
這樣就可以先用BS。
最後得到的結果加上 .decode("unicode-escape") 就可以正常轉中文
第一次見到 .decode("unicode-escape") 簡直感動…


字元串有個decode方法,可以按指定編碼解碼。


XXXString.encode("utf-8").decode("unicode_escape") 呢?
latin-1 字符集還是有有很大的局限


import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")

我的開發環境是python3.6.2

用的ATOM編輯器


print(x.encode("utf8"))


@土羊 感謝

import codecs
import random

def random_char():
char_code = random.randint(0x4e00, 0x9fbb)
str = "\u{}".format(format(char_code, "x"))
char = codecs.decode(str,"unicode_escape")
return char

for x in range(10):
print(random_char())

還是基礎薄弱,這個搞了兩三個小時。。。


str = ""\u5c3c\u5eb7""
str = codecs.decode(str,"unicode_escape")
print(str) #輸出:尼康

Python3 可以用上面這個


看的頭暈啊!編碼真是把人繞暈了啊!


推薦閱讀:

TAG:Unicode統一碼 | Python3x | 爬蟲計算機網路 | JSON |