五分钟战胜 Python 字符编码
admin
2023-07-31 00:46:10
0

对于很多接触Python的人而言,字符的处理和语言整体的温顺可靠相比显得格外桀骜不驯难以驾驭。

本文不谈复杂的理论,就经验教你字符处理八字真言:确定编码,同类交互。

文章针对Python 2.7,主要因为3对的编码已经有了很大的改善并且实际原理一样,更改一下操作命令即可。

了解完本文,你可以轻松解决文字处理,特殊平台(Windows?)下的编码,爬虫编码等问题。

阅读建议

本文分为如下几个部分:

  • 原理
  • 具体操作
  • 建议的使用习惯
  • 疑难问题解答

如果想要了解我给出的使用习惯,可以直接跳到建议的使用习惯。

如果只想要解决相关问题可以直接跳到疑难问题解答。

希望本文能够帮到你。

原理

为了理解方便,这里不谈理论只做类比,具体想要进一步了解各种编码的理论的搜狗一下好了。

首先说一下我们为什么会碰到各式各样的编码问题:

  • 因为我们没有统一编码
  • 因为我们没有用对命令(传对数据)

再说一下编码是什么,Python的编码看似复杂,实际上可以看做只有两类编码:Unicode,二进制

  • Unicode 相信都很熟悉:,就是\\u0000这样的
  • 二进制编码也很简单,就是\\x00\\x00这样的,平常看到的utf-8,cp936都是二进制编码
  • 二进制编码是具象的,10001100原样就可以存储,而Unicode是抽象的,不能这样存

1234567891011 #coding=utf8 # Unicode编码演示print(\’Unicode:\’)print(repr(\’Unicode编码\’))` # 二进制编码演示print(u\’二进制编码:\’)print(repr(\’Unicode编码\’))` # 只是看个样子,代码不必去深究

再说怎么做,就是只有同种编码之间才可以操作

  • 举个简单的类比

    1234 就把一串数据比为烤鸭,我们作为人和鸭子不同种看待烤鸭的态度完全不一样。我们看到的是晚上的配菜,鸭子看到的是自己二舅。那么我在逛烤鸭店的时候用错编码就会报错。因为我在烤鸭店看到了满世界的二舅。

  • 这里说的同种就是我们熟悉的各种编码方式:utf-8,unicode,ucs-bom
  • 这也就是编码问题的核心,非常重要。

最后说一下Python的环境

  • 本身代码是用Ascii解码的,文件里有Ascii无法解码的内容的话要告知Python怎么解码
  • 内部大量命令都是默认接受Unicode

123 # 告知的命令就是下面这一行,删掉就会报错#coding=utf8print(u\’测试编码\’)

具体操作

拿到各种编码的内容自然是不用说,那么如果我们想要自己构造怎么做呢,看下面:

123456789 #coding=utf8 # 字符串前面加u会默认构造出Unicode的字符串unicodeString = u\’Unicode字符串\’ # 字符串前面什么都不加会构造出默认编码(首行限定了现在的utf8)的字符串utf8String = \’Utf-8字符串\’ # 当然,没有首行,默认的编码是Ascii

那么他们之间怎么转换呢,同样很简单:

12345678910 # 接上一段程序 # Unicode转化为二进制编码中的一种:utf8unicodeString.encode(\’utf8\’) # 二进制编码根据自己的编码种类转化为Unicodeutf8String.decode(\’utf8\’) # 如果二进制编码中混进了奇怪的东西可以根据需求用特殊的decode策略print(repr(\’u8字\\x00符串\’.decode(\’utf8\’, \’replace\’)))

那么怎么样会出现问题呢:

1234567891011 # 接上一段程序 # 如果我们把他们转化成同样的编码方式就可以操作(例如相加)print(repr(unicodeString + utf8String.decode(\’utf8\’)))print(repr(unicodeString.encode(\’utf8\’) + utf8String)) # 但如果不转化,当然就会出现满世界的烤鸭二舅啦unicodeString + utf8String # 所以另一方面也发现,编码转换是需要我们告诉程序怎么做的# 所有`decode`操作都会生成Unicode编码,这是为了方便我之前说的大量接受Unicode的内部命令

所以我们需要确定程序使用的编码,这是我们需要告诉程序的东西

  • 一方面在操作字符串的时候确定是同种编码
  • 另一方面在使用非自己写的命令时,一般使用Unicode,或者使用接收二进制编码的命令

1234567891011 #coding=utf8# 这里拿写入文件举例 # 一般使用Unicodewith open(\’Unicode.txt\’=\”crayon-line\” id=\”crayon-5812b1609b902049131566-3\”> # 一般使用Unicodewith open(\’Unicode.txt\’编码,同类交互。

文章针对Python 2.7,主要因为3对的编码已经有了很大的改善并且实际原理一样,更改一下操作命令即可。

了解完本文,你可以轻松解决文字处理,特殊平台(Windows?)下的编码,爬虫编码等问题。

阅读建议

本文分为如下几个部分:

  • 原理
  • 具体操作
  • 建议的使用习惯
  • 疑难问题解答

如果想要了解我给出的使用习惯,可以直接跳到建议的使用习惯。

如果只想要解决相关问题可以直接跳到疑难问题解答。

希望本文能够帮到你。

原理

为了理解方便,这里不谈理论只做类比,具体想要进一步了解各种编码的理论的搜狗一下好了。

首先说一下我们为什么会碰到各式各样的编码问题:

  • 因为我们没有统一编码
  • 因为我们没有用对命令(传对数据)

再说一下编码是什么,Python的编码看似复杂,实际上可以看做只有两类编码:Unicode,二进制

  • Unicode 相信都很熟悉:,就是\\u0000这样的
  • 二进制编码也很简单,就是\\x00\\x00这样的,平常看到的utf-8,cp936都是二进制编码
  • 二进制编码是具象的,10001100原样就可以存储,而Unicode是抽象的,不能这样存

1234567891011 #coding=utf8 # Unicode编码演示print(\’Unicode:\’)print(repr(\’Unicode编码\’))` # 二进制编码演示print(u\’二进制编码:\’)print(repr(\’Unicode编码\’))` # 只是看个样子,代码不必去深究

再说怎么做,就是只有同种编码之间才可以操作

  • 举个简单的类比

    1234 就把一串数据比为烤鸭,我们作为人和鸭子不同种看待烤鸭的态度完全不一样。我们看到的是晚上的配菜,鸭子看到的是自己二舅。那么我在逛烤鸭店的时候用错编码就会报错。因为我在烤鸭店看到了满世界的二舅。

  • 这里说的同种就是我们熟悉的各种编码方式:utf-8,unicode,ucs-bom
  • 这也就是编码问题的核心,非常重要。

最后说一下Python的环境

  • 本身代码是用Ascii解码的,文件里有Ascii无法解码的内容的话要告知Python怎么解码
  • 内部大量命令都是默认接受Unicode

123 # 告知的命令就是下面这一行,删掉就会报错#coding=utf8print(u\’测试编码\’)

具体操作

拿到各种编码的内容自然是不用说,那么如果我们想要自己构造怎么做呢,看下面:

123456789 #coding=utf8 # 字符串前面加u会默认构造出Unicode的字符串unicodeString = u\’Unicode字符串\’ # 字符串前面什么都不加会构造出默认编码(首行限定了现在的utf8)的字符串utf8String = \’Utf-8字符串\’ # 当然,没有首行,默认的编码是Ascii

那么他们之间怎么转换呢,同样很简单:

12345678910 # 接上一段程序 # Unicode转化为二进制编码中的一种:utf8unicodeString.encode(\’utf8\’) # 二进制编码根据自己的编码种类转化为Unicodeutf8String.decode(\’utf8\’) # 如果二进制编码中混进了奇怪的东西可以根据需求用特殊的decode策略print(repr(\’u8字\\x00符串\’.decode(\’utf8\’, \’replace\’)))

那么怎么样会出现问题呢:

1234567891011 # 接上一段程序 # 如果我们把他们转化成同样的编码方式就可以操作(例如相加)print(repr(unicodeString + utf8String.decode(\’utf8\’)))print(repr(unicodeString.encode(\’utf8\’) + utf8String)) # 但如果不转化,当然就会出现满世界的烤鸭二舅啦unicodeString + utf8String # 所以另一方面也发现,编码转换是需要我们告诉程序怎么做的# 所有`decode`操作都会生成Unicode编码,这是为了方便我之前说的大量接受Unicode的内部命令

所以我们需要确定程序使用的编码,这是我们需要告诉程序的东西

  • 一方面在操作字符串的时候确定是同种编码
  • 另一方面在使用非自己写的命令时,一般使用Unicode,或者使用接收二进制编码的命令

123

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...