python中文编码与json中文输出问题详解

  

  

python2。x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍python中字符串处理的原理,附带解决json文件输出时,显示中文而非unicode问题。首先简要介绍字符串编码的历史,其次,讲解python对于字符串的处理,及编码的检测与转换,最后,介绍python爬虫采取的json数据存入文件时中文输出的问题。
  

  

参考书籍:Python网络爬虫从入门到实践,唐松

  

<强>在python 2或3者,字符串编码只有两类:

  

(1)通用的Unicode编码;
  

  

(2)将Unicode转化为某种类型的编码,如utf - 8、GBK;

  

  

计算机只处理数字,因此处理文本时,必须转换成数字才行。
  

  

8位(比特)=1字节(字节)=256种不同状态=从000000年到111111年;
  

  

1 gb=1024=1024 (1024 kb)=1024 (1024 (1024 b));

  

<强> ASCII编码是对应英文字符与二进制数字之间的关系,ASCII一共规定了128种,如大写字母是65,即01000001;可见一字母一字节;

  

<强> GB2312编码简体中文常见的编码,两个字节代表一个中文汉字,理论上256 * 256个编码,即可表示65536种中文字;

  

各国编码不同,为了各国能扩平台进行文本的转换与处理,Unicode就被作为统一码或者单一码.Unicode编码通常是两个字节,Unicode与ASCII编码的区别,在于Unicode在ASCII编码前加了一个0,即字母的ASCII编码为01000001,Unicode编码即为0000000001000001,但英文字母其实只用一个字节就够了,Unicode编码写英文时多了一个字节,浪费存储空间,因而Unicode开发了通用转换格式(Unicode转换格式(UTF)),常见的有UTF - 8或者UTF - 16;

  

<>强要明白编码()和解码()的区别
  

  

编码()的作用是将Unicode编码的字符串转换为其他编码格式。
  

  

例如:<代码> st1.encode (“utf - 8”) 这句话的作用是将Unicode编码的相约编码为utf - 8编码的字符串
  

  

decode()的作用是把其他编码格式的字符串转换成Unicode编码的字符串。
  

  

例如:<代码> st2.decode (“utf - 8”) 这句话的作用是将utf - 8编码的字符串st2解码为Unicode编码的字符串
  

  

<强>第二,除Unicode编码的字符串以外,任何一种编码的字符串要想转换为其他编码格式,必须先解码后编码
  

  

非Unicode编码——比;Unicode编码——在非Unicode编码
  

  

例如,utf - 8编码的字符串圣想要转换为gbk编码的字符串,必须经过以下步骤:
  

        圣=st.decode (“utf - 8”) #解码为Unicode编码   圣=st.encode (gbk) #从Unicode编码编码为gbk编码      

<强>第三,我们经常使用的utf - 8编码还分为有BOM的和无BOM的。
  

  

<强>第四:关于json文件的中文编码。用Python读取json文件时经常用到json.load()函数,该函数对json文件的格式是有要求的
  

  

1) json文件是utf - 8没有BOM编码的,那么可以直接用<代码> json.load(文件名)函数读取json文件的内容
  

  

2) json文件是utf - 8和BOM编码的,不能用<代码> json.load() 函数读取,<代码> json.load() 不能正确识别
  

  

3) json文件时其他编码的,比如gbk,要把json文件的编码格式作为一个参数传给<代码> json.load() :
  

        如。json.load(文件名,“gbk”)      

<强>第五,怎么查看并且设置自己文件的编码呢。
  

  

介绍一个个人比较喜欢的工具“Nodtepad + +”,随便一个软件管家里就与一键安装。
  

  

用这个工具你可以方便的查看自己的文件的当前编码,并可以轻松转换成任意其他编码格式
  

  

  

参考地址:https://www.jb51.net/article/139878.htm

  

(1)编码的作用是,将unicode对象编码成其他编码的字符串,str.encode (utf - 8),编码成utf - 8;(2)解码的作用是将其他编码的字符串转换成unicode编码,str.decode (utf - 8);

  
      <李>进口chardet查阅具体的编码类型,chardet.detect (str),但是str不能是unicode编码类型,但是该方法不接受本来已经是unicode的编码的参数,会有TypeError:预期中bytearray,字节或类型的对象有:& lt;类型unicode的祝辞错误;李   <李>作为统一标准,unicode不能再被解码,如果utf - 8想转至其他非unicode,则必须(2)先解码到unicode,在编码到其他非unicode的编码。

    python中文编码与json中文输出问题详解