中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何實現模擬錕斤拷等各類亂碼

發布時間:2023-02-23 16:01:33 來源:億速云 閱讀:111 作者:iii 欄目:開發技術

這篇文章主要講解了“Python如何實現模擬錕斤拷等各類亂碼”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python如何實現模擬錕斤拷等各類亂碼”吧!

錕拷碼和口字碼

說到亂碼問題就不得不提到錕斤拷,這算是非常常見的一種亂碼形式,那么它到底是經過何種錯誤操作產生的呢?下面我們一步步探究。

看一個基本示例:

"??".encode("u8").decode("gbk")

'錕斤拷'

我們將?字符以UTF-8編碼后,以GBK編碼解碼就可以得到 錕斤拷 的亂碼。

那么為什么 錕斤拷 為什么如此常見呢?這是因為大部分編程語言在使用UNICODE系列的編碼去解碼時,會將不識別的字節編碼為0xFFFD(65533)即?字符表示未知字符進行占位:

"\uFFFD"

'?'

注意:UNICODE系列包括UTF-8、UTF-16、UTF-32編碼,一般UNICODE編碼指UTF-16編碼。在python中unicode_escape編碼表示UNICODE編碼的的轉義形式:

"\uFFFD".encode("unicode_escape").decode()
'\\ufffd'

對于Python,默認情況下解碼碰到未知字符時會直接拋出異常,但是如果設置errors參數為replace時,則會將未知字符解碼為?占位。

將漢字用GBK編碼:

"小小明".encode("gbk")

b'\xd0\xa1\xd0\xa1\xc3\xf7'

將上述編碼結果用UTF-8編碼解碼,并設置為替換模式:

"小小明".encode("gbk").decode("u8", "replace")

'СС??'

0xd0a1被解碼成С,但是0xc3和0xf7無法被UTF-8編碼識別,只能用占位符?替換,于是就得到了上面的結果。

此時我們再編碼并解碼:

"小小明".encode("gbk").decode("u8", "replace") \
    .encode("u8").decode("gbk", "replace")

'小小錕斤拷'

這是因為?被編碼成了0xEFBFBD

"??".encode("u8")

b'\xef\xbf\xbd\xef\xbf\xbd'

而0xEFBFBDEFBFBD被GBK解碼時,正好就是錕(0xEFBF),斤(0xBDEF),拷(0xBFBD)。

上述以?為主的亂碼字符就是口字碼,原因是以UTF-8編碼讀取了GBK編碼的中文。

而錕拷體則是大部分都是錕斤拷的全中文字符,原因是用GBK編碼讀取了UTF-8編碼的口字碼中文。

古文碼與問句碼

問句碼產生的核心原因在于GBK對于無法編碼的字符會使用?填充:

"?????".encode("gbk", "replace")

b'??'

古文碼則與前面的口字碼產生原因相反,使用GBK編碼讀取以UTF-8編碼的中文:

"小小明".encode("u8").decode("gbk", "replace")

'灝忓皬鏄?'

此時的 灝忓皬鏄 就非常像古文,gbk解碼對于不識別的字節也使用?占位。

此時gbk編碼對于?編碼失敗,使用?替代:

'灝忓皬鏄?'.encode("gbk", "replace")

b'\xe5\xb0\x8f\xe5\xb0\x8f\xe6\x98?'

此時再用UTF-8解碼就得到了問句碼:

b'\xe5\xb0\x8f\xe5\xb0\x8f\xe6\x98?'.decode("u8", "ignore")

'小小?'

不過問句碼只在原始字符串為奇數時產生,如果原始字符串長度為偶數,使用上述編碼方式則可以原樣還原字符串:

"小小明月".encode("u8").decode("gbk", "replace") \
    .encode("gbk", "replace").decode("u8", "ignore")

'小小明月'

這樣說明只要我們將原始漢字字符串填充到偶數,就可以使用古文碼實現可逆的數據傳輸,而錕拷體則是一種不可逆的亂碼。

符號碼和拼音碼

還有兩種可逆的亂碼,我們先看看符號碼:

"小小明".encode("u8").decode("iso8859-1")

'å°\x8få°\x8fæ\x98\x8e'

像這種大部分字符為各種符號的亂碼就稱為符號碼,符號碼可以直接還原為原始的文本:

'?°\x8f?°\x8f?\x98\x8e'.encode("iso8859-1").decode("u8")

'小小明'

再看看拼音碼:

"小小明".encode("gbk").decode("iso8859-1")

'ССÃ÷'

這種大部分字符都是帶有聲調的字母稱為拼音碼,同樣可以直接還原:

'D?D??÷'.encode("iso8859-1").decode("gbk")

'小小明'

感謝各位的閱讀,以上就是“Python如何實現模擬錕斤拷等各類亂碼”的內容了,經過本文的學習后,相信大家對Python如何實現模擬錕斤拷等各類亂碼這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

博野县| 东阿县| 南城县| 精河县| 沭阳县| 佳木斯市| 桦南县| 嘉义县| 玉溪市| 城步| 宜阳县| 辽中县| 茂名市| 长兴县| 普格县| 廊坊市| 博白县| 乌兰县| 宁津县| 德格县| 贺兰县| 孟村| 左权县| 淮北市| 英山县| 南平市| 东山县| 章丘市| 天门市| 永丰县| 永州市| 东辽县| 宣武区| 灵台县| 建水县| 阳春市| 宝坻区| 和平县| 大丰市| 营山县| 健康|