楔子

在请求数据的时候,我们得到的可能是一堆字节,这个时候我们会通过decode将其解码。但是解码的前提是我们需要知道其对应编码是什么,比如:utf-8iso-8859-1gbk等等。而python也提供了相应的模块,用于检测字节对应的编码。

chardet检测编码

  1. from chardet import detect
  2. # 直接传入字节即可
  3. print(detect(b"are you ok?")) # {'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
  4. """
  5. 可以看到返回一个字典,包含三个key:
  6. encoding: 使用的编码
  7. confidence: 检测的准确度
  8. language: 所使用的语言
  9. """

对于其它语言也是支持的

  1. from chardet import detect
  2. chinese_utf8 = "你为什么这么熟练啊".encode("utf-8")
  3. chinese_gbk = "你为什么这么熟练啊".encode("gbk")
  4. print(detect(chinese_utf8))
  5. # {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
  6. print(detect(chinese_gbk))
  7. # {'encoding': 'GB2312', 'confidence': 0.8888888888888888, 'language': 'Chinese'}

我们看到当使用utf-8编码的时候,虽然能检测出编码,但是无法推测出语言,因为任何语言的字符都可以正常使用utf-8进行编码。但是下面的gbk是可以推断出语言的,因为这是专门用于中文的编码,显示的gb2312是gbk的子集。

  1. from chardet import detect
  2. jp_utf8 = "なんでそんなに慣れてんだよ".encode("utf-8")
  3. jp_euc = "なんでそんなに慣れてんだよ".encode("euc-jp")
  4. print(detect(jp_utf8))
  5. # {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
  6. print(detect(jp_euc))
  7. # {'encoding': 'EUC-JP', 'confidence': 1.0, 'language': 'Japanese'}

对于日文也是一样的,chardet支持多种语言。

尤其是向其它地方请求数据的时候,给你返回了一堆你不知道是什么编码的字节,这个时候就可以使用chardet,最典型的就是requests。

我们在使用requests的get方法之后,会调用text得到请求的html。但是有时候调用text返回的内容里面包含乱码,这是因为requests在内部是先获取的字节,然后再进行解码、返回,而在解码的时候,使用了错误的编码造成的

而一般我们在调用text之前,我们会手动指定使用的编码

  1. import requests
  2. res = requests.get("http://www.baidu.com")
  3. # res.content: 会拿到html对应的字节流
  4. # res.encoding: 所使用的编码,根据网站决定
  5. # res.text: 会先获取res.content,然后通过res.encoding进行解码得到res.txt
  6. # 但是默认的res.encoding不一定能够正常解码,这个时候我们会手动指定res.encoding
  7. # 将res.apparent_encoding赋值给res.encoding
  8. res.encoding = res.apparent_encoding
  9. # 然后调用res.text就能正常打印内容了
  10. print(res.text)

那么我们就可以进入源码中看看这个res.apparent_encoding是什么

  1. @property
  2. def apparent_encoding(self):
  3. """The apparent encoding, provided by the chardet library."""
  4. return chardet.detect(self.content)['encoding']

看到了吗?requests也是通过chardet检测对应的编码的,因为requests默认使用网站返回的编码,但是不一定靠谱。而通过这一步,会根据返回的字节手动推断出其使用的编码,然后赋值给res.encoding,这样再解码就没有问题了。

因此想知道返回的字节是什么编码的话,使用chardet是个很不错的选择。

uuid:全局唯一标识符的更多相关文章

  1. JS生成全局唯一标识符(GUID,UUID)的方法

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...

  2. Javascript 生成全局唯一标识符 (GUID,UUID)

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...

  3. GUID全局唯一标识符

         全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中. ...

  4. GUID全局唯一标识符相关知识了解

     全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情 ...

  5. 全局唯一标识符(GUID)

    全局唯一标识符,简称GUID(发音为/ˈɡuːɪd/或/ˈɡwɪd/),是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA-106 ...

  6. GUID (全局唯一标识符)

         全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中. ...

  7. Identifier:GUID (全局唯一标识符)

    ylbtech-Miscellaneos-Identifier:GUID (全局唯一标识符) A,返回顶部 1, 全局唯一标识符(GUID,Globally Unique Identifier)是一种 ...

  8. 全局唯一标识符(GUID,Globally Unique Identifier)

    全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况 ...

  9. [ActionScript 3.0] AS3 GUID(全局唯一标识符)

    package com.controls { import flash.display.Sprite; import flash.system.Capabilities; public class G ...

  10. GUID(Globally Unique Identifier)全局唯一标识符

    最近有大量数据存入数据库时,因为主键为一个nvarchar类型,起初想着用int 类型,每次打开表的时候,获取最后一行的ID,然后让其++. 但发现由于字段是char类型,数据库对其进行了排序.再次插 ...

随机推荐

  1. linux操作备份

    ---------------------------------------------------------------------------------------------------- ...

  2. dp[2019.5.25]_2

    1.对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和.2个非空格字符的距离是它们的ASCII码之差的绝对值.空格与空格的距离为0,空格与其他字符的距离为一定值k. 在一般情况下,字符串 ...

  3. nginx 解决session一致性

    session 粘滞性每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题. upstream backserver {ip_hash;server ...

  4. ORB-特征点提取代码比较

    ORB特征提取代码测试 整合ICE-BA.ORB-SLAM2.openvslam中的ORB提取代码,并比较速度,方便以后使用 1. ORB-SLAM2 vsICE-BA vs openvslam IC ...

  5. Vue的作用域插槽

    一.通常情况下都是父组件传递数据给子组件进行展示的(无法改变子组件的展示方式):而作用域插槽允许子组件通过slot向父组件传递数据,类似React中的“以函数为子组件”,由父组件决定渲染的内容(包含绑 ...

  6. StormUI各参数详解

    参考:http://www.malinga.me/reading-and-understanding-the-storm-ui-storm-ui-explained/  

  7. Spring Boot CommandLineRunner的使用

    1. 说明 程序在启动完成的时候需要去处理某些业务,因此Spring Boot程序中需要去实现CommandLineRunner接口. 2. CommandLineRunner方法执行顺序 程序启动后 ...

  8. Kubernetes组件-CronJob(定时任务)

    ⒈简介: Kubernetes的Job资源在创建时会立即运行pod.但是许多批处理任务需要在特定的时间运行,或者在指定的时间间隔内重复运行.在Linux和类UNIX操作系统中,这些任务通常被称为cro ...

  9. dedecms发布文章时间显示多少分钟前

    /**文章发布多少时间前*/function tranTime($time) { $rtime = date("m-d H:i",$time); $htime = date(&qu ...

  10. PHP学习之PHP的语法糖

    PHP的语法糖 计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用.  常见的PHP的语法糖 echo(),print(),die(),isset(),unset(),i ...