Python中关于coding=utf-8以及中文字符前加u的解释

写了很久的Python了,每次写之前都要在开头加上coding=utf-8,只知道是设置编码格式,但并没有太在意,今天在写socket编程时才发现编码格式的重要性。

一、关于开头coding=utf-8

开头的coding=utf-8和coding:utf-8的作用是一样的。

它们的作用都是声明python代码的文本格式是utf-8编码的,也即告诉python解释器要按照utf-8编码的方式来读取程序。

如果不加这个声明,无论代码中还是注释中有中文都会报错。

以下几种方式都可以:

# coding=utf-8

a = 10
print '这是内容'
# coding:utf-8

a = 10
print '这是内容'

注意一点无论中间是:还是=,其中coding与它们之间都不能有空格。否则也会报错。

注意:以上是针对Python2.x的版本而言,因为在Python2.x的版本中文本默认采用的是ASCII编码方式,而Python3.x的版本中,默认使用的就是UTF-8编码格式,所以就不需要在前面进行声明了。

二、关于中文字符前面的u

首先,我们先从最开始的ASCII编码开始说起,我们知道计算机在处理程序时是看不懂文字的,它眼里只有0/1数字。所以最开始的ASCII编码是通过1个字节也就是8bit来表示英文字符。因为8个二进制位可以表示出256中状态,所以用来表示英文字符绰绰有余,因此ASCII码只用到了8个二进制中的后七位,也就是可以得到128个字符。

但是像一些其他语言的字符想通过最多只能表示256个字符的ASCII编码来表示就不太实际了。我们中华文明博大精深,光汉字就有超过6万多,所以必须有一种可以表示更多字符的编码方式,如常见的GB2312编码方式,它是通过两个字节来表示一个汉字,这样最多就可以表示256*256=65536个字符了。

而由于GB2312不能处理一些古汉语或者人名中的一些罕见字,所以导致了后面的GBK编码GB18030编码方式的出现。其中,GBK也是双字节的编码方式,并且GBK字符集中共收入了21886个汉字和图像符号。除此之外,GBK还可以与GB 2312完全兼容。

既然对于每种语言都有其对应的字符集,那么是否存在一种字符集可以包含世界上所有的符号呢。所以产生了Unicode编码。Unicode编码为世界上所有的语言的每个字符都设定了唯一的二进制编码,这样就可以实现跨语言进行文本转换和传输了。

通过Unicode进行编码时,不同字符所占用的位的长度是不同的,也就是说有的字符编码仅需要几位,而有的则需要十几位,这就导致了如果都采用固定长度的编码时,就会造成空间的浪费。所以就衍生出了对于Unicode编码的不同实现方式,如常见到的UTF-8UTF-16UTF-32,其中UTF-8是最为常用的编码方式,它采用了变长字节的表示方式,即使用的字节数是可变的,这个变化是根据字符对应的Unicode编号的大小所变化的,即编号小的字符使用的字节数就少,编号大的字符使用的字节数就多,因此,使用的字节个数从1到4个不等。

所以,回到主题,Python中用到的字符串前面加上u的作用是声明对后面的字符串进行unicode编码,常用于中文字符串的处理。Unicode是书写国际文本的标准方法,如果你想用你的母语来写文本的时候,就需要一个支持Unicode的编译器,Python允许处理Unicode文本,只需在字符串前加上前缀u即可。一般英文的字符串不需要进行任何编码的处理,但是当你使用中文的时候,就需要在前面加上u了。

 

最后再引用知乎上某个大佬举的例子来加深理解一下:https://www.zhihu.com/question/23374078/answer/65352538

 

举一个例子:It's 知乎日报

你看到的unicode字符集是这样的编码表:

I 0049
t 0074
' 0027
s 0073
  0020
知 77e5
乎 4e4e
日 65e5
报 62a5

每一个字符对应一个十六进制数字。

计算机只懂二进制,因此,严格按照unicode的方式(UCS-2),应该这样存储:

I 00000000 01001001
t 00000000 01110100
' 00000000 00100111
s 00000000 01110011
  00000000 00100000
知 01110111 11100101
乎 01001110 01001110
日 01100101 11100101
报 01100010 10100101

这个字符串总共占用了18个字节,但是对比中英文的二进制码,可以发现,英文前9位都是0!浪费啊,浪费硬盘,浪费流量。

怎么办?

UTF。

UTF-8是这样做的:

1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;

2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。

这样就形成了如下的UTF-8标记位:

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
... ...

于是,”It's 知乎日报“就变成了:

I 01001001
t 01110100
' 00100111
s 01110011
  00100000
知 11100111 10011111 10100101
乎 11100100 10111001 10001110
日 11100110 10010111 10100101
报 11100110 10001010 10100101

和上边的方案对比一下,英文短了,每个中文字符却多用了一个字节。但是整个字符串只用了17个字节,比上边的18个短了一点点。

另外一个汉字在UTF-8编码的情况下可能需要三个字节,而使用gbk两个字节就足够了,所以有时候为了节省流量和硬盘,在使用中文的时候,也有用gbk或者gbk2312编码的。

 

 

 

 

 

 

  • 33
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: Python使用UTF-8编码的方法如下: 1. 在Python文件的开头添加以下代码: ```python # -*- coding: utf-8 -*- ``` 这行代码告诉Python解释器,该文件使用UTF-8编码。 2. 在打开文件时指定编码方式: ```python with open('file.txt', 'r', encoding='utf-8') as f: # do something ``` 这行代码告诉Python打开文件时使用UTF-8编码。 3. 在字符使用UTF-8编码: ```python s = '你好,世界!' s.encode('utf-8') ``` 这行代码将字符串s转换为UTF-8编码。 总之,在Python使用UTF-8编码非常简单,只需要在需要使用UTF-8编码的地方指定编码方式即可。 ### 回答2: Python是一种高端的编程语言,它拥有强大的编程能力和广泛的应用领域。在Python编程编码是一个非常重要的问题。因为Python支持各种语言,所以需要考虑到多种编码方式。通过在Python程序使用encoding=utf-8参数,可以很好地解决这个问题。 在Python,可以通过在文件添加encoding=utf-8修改文件编码格式。这样可以使Python程序正确地读取和解码各种语言的字符集。通常,将这个参数添加到Python文件的第一行可以防止一个常见的“UnicodeDecodeError”的错误。 此外,在Python使用字符串时,也需要注意编码问题。如果字符含有非ASCII字符,那么必须将编码设置为UTF-8。这可以通过在代码添加“-*- coding: utf-8 -*-”来实现。这个代码应该放在Python文件的第一行,确保在执行代码时使用UTF-8编码格式。这样可以避免出现UnicodeDecodeError错误。 总之,Python encoding=utf-8是一个非常有用的功能,可以让Python程序正确地读取和解码各种语言的字符集。在Python编程,特别是涉及到非ASCII字符的时候,要注意使用编码功能来避免出现错误。同时也可以通过一些编码检查工具来检查代码是否存在编码问题,这有助于提高Python程序的质量和可靠性。 ### 回答3: Python是一种广泛使用的编程语言,用于开发各种类型的应用程序。在Python编码是一项重要的任务,因为不同的编码方式会影响程序的行为和结果。 编码是将字符映射到数字的过程。Python默认使用UTF-8编码,因为UTF-8可以处理所有的字符集。UTF-8使用变长编码,可以将任意的Unicode字符编码为1-4个字节。因此,使用UTF-8编码可以确保程序能够正确地处理各种类型的字符。 对于在Python使用UTF-8编码的步骤,下面提供一些实用的建议: 1. 在Python脚本的第一行添加# coding=utf-8这一行,告诉Python解释器使用UTF-8编码: # coding=utf-8 2. 在文件使用Unicode字符串而不是ASCII字符串。在Python 3,所有的字符串默认都是Unicode字符串(str类型),而在Python 2,则需要使用Unicode字符串(unicode类型),或者使用字符串前缀u,例如: # Python 3 s = "Hello, 你好" # Python 2 s = u"Hello, 你好" 3. 使用str.encode()和bytes.decode()方法将字符串转换为字节数组或把字节数组转换为字符串,例如: # 将字符编码为字节数组 s = "你好" b = s.encode('utf-8') # 将字节数组解码为字符串 s = b.decode('utf-8') 4. 在使用文件读写操作的时候,也需要指定编码方式: # 读取文件 with open('file.txt', encoding='utf-8') as f: content = f.read() # 写入文件 with open('file.txt', mode='w', encoding='utf-8') as f: f.write('Hello, 你好') 总之,在Python使用UTF-8编码非常简单和方便。只需要添加# coding=utf-8这一行,使用Unicode字符串,转换为字节数组或字符串时指定编码方式即可。同时,使用文件读写操作时也需要指定编码方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值