python3 unicod,utf-8,gbk的編碼和解碼中文顯示問題

python3的字符編碼讓人頭疼。
這個也不是一篇介紹gbk, utf-8, unicode怎麼表示英文,中文字符的基礎知識總結。
網上有不少相似的文章,目前也不須要升入學習到了解各個bit位表示什麼含義。html

目的:
清楚瞭解爲何在python3不一樣的編碼,解碼,windows,linux操做系統下,字符是否可以正確顯示。python

前提:
瞭解不一樣編碼用不一樣的二級制編碼和長度來表示字符。
在python3中,各類字符編碼之間的互相轉換都要經過unicode做爲中間編碼轉換。gbk轉換成unicode,再從unicode轉換成utf-8。linux

分析:
要區分4種編碼解碼概念,windows

1.編寫代碼文件時的編碼。
notepad++ 在菜單「編碼」中有選擇,在狀態欄能夠看到編碼類型。
pycharm 在菜單"file","editor","file encoding"中能夠設置默認編碼。在狀態欄能夠看到編碼類型。編輯器

2.python3代碼中申明的解碼格式。
在代碼中#coding=gbk。
編碼聲明告訴了python編譯器以什麼格式的編碼來解碼.py文件,它不會改變系統默認編碼和本地默認編碼,
也不是用於聲明當前代碼文件的編碼格式的,而是聲明當前代碼文件的解碼方式。換句話說,
代碼文件的編碼格式取決於你使用的編輯器,而如何解碼該文件取決於文件頭處的編碼聲明。
通常地,編碼格式應當與解碼格式一致,即編輯器的編碼格式與編碼聲明應當一致。ide

注:根據代碼中申明的解碼類型,pycharm會自動改變編碼類型,讓編碼類型和解碼類型保持一致。這是pycharm的優勢。學習

3.python解釋器的默認編碼格式。
當python的編譯器讀取.py文件時,若無編碼聲明,則使用系統默認編碼來解碼.py文件。
用 import sys, sys.getdefaultencoding() 查看編碼

4.本地默認編碼
本地指的纔是操做系統,所以本地默認編碼即操做系統的默認編碼。
顯然,python編譯器的默認編碼在不一樣的操做系統中保持一致,操做系統的默認編碼隨操做系統的不一樣而發生了改變。
用import locale, locale.getdefaultlocale()查看。 windows是gbk, linux是utf-8。操作系統

例子1:
python3 一箇中文字符串(str='中')utf-8編碼,代碼申明解碼爲GBK,代碼中用gbk寫到(文件系統write方法)另一個文件f2,在linux中顯示的過程。
分析:.net

  1. python3代碼文件用utf-8編碼中文字符 」中「 爲 b'\xe4\xb8\xad'
  2. python3解釋器用代碼申明GBK讀取 b'\xe4\xb8\xad', 獲得 亂碼字符串(unicode形式,字符串在內存中爲unicode編碼), 假如爲字符%。
  3. python3代碼用GBK編碼 將字符%對於的GBK編碼b'\xe4\xb8\xad'寫入文件f2
  4. linux終端用uft-8打開 b'\xe4\xb8\xad',能正常顯示

例子2:
python3 一箇中文字符串(str='中')utf-8編碼,代碼申明解碼爲GBK,代碼中用uft-8寫到(文件系統write方法)另一個文件f2,在linux中顯示的過程。
分析:

  1. python3代碼文件用utf-8編碼中文字符 」中「 爲 b'\xe4\xb8\xad'
  2. python3解釋器用代碼申明GBK讀取 b'\xe4\xb8\xad', 獲得 亂碼字符串(unicode形式,字符串在內存中爲unicode編碼), 假如爲字符%。
  3. python3代碼用uft-8編碼,將字符%對應的utf-8編碼(確定不是 b'\xe4\xb8\xad'的二進制數值了),寫入文件f2
  4. linux終端用uft-8打開一個不是b'\xe4\xb8\xad'的編碼,不能正常顯示。

參考文章:

  1. https://www.cnblogs.com/yuanchenqi/articles/5956943.html

  2. https://mp.weixin.qq.com/s/JxD7LC33zbFD5QBxJ6jMWw

  3. https://blog.csdn.net/qq_33692803/article/details/81321340?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
相關文章
相關標籤/搜索