Python 编码

python默认编码为 'ascii',查看方法:

homer@homer-pc:~/script$ python
>>> import sys
>>> sys.getdefaultencoding()
'ascii'

 

python 设置自定义编码,方法如下:

homer@homer-pc:~/script$ python
>>> import sys
>>> reload(sys)

<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> sys.getdefaultencoding()
'utf-8'

 

python 在代码中设置编码,标准格式如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

 

==============================

 

utf-8 和 utf8 区别

“UTF-8”是编码格式的标准写法

PHP在Windows下英文不区分大小写,所以也可以写成“utf-8”

“UTF-8”也可以把中间的“-”省略,简写成“UTF8”,一般程序都能识别,但也有例外(如MySQL),为了严格规范,最好用标准的大写“UTF-8

 

在数据库中只能使用utf8

例如: 在MySQL的命令模式中只能使用“utf8”,不能使用“utf-8”,也就是说在PHP程序中只能使用“set names utf8(不加小横杠)”,如果你加了“-”此行命令将不会生效,但是在PHP中header时却要加上“-”,因为IE不认识没杠的“utf8”,原因如下:

1)PHP中的header

 <?php header('Content-Type: text/html; charset=UTF-8'); ?>

// 奇怪了:Content-Tyep用冒号,Chatset却是等号

2)静态文件使用

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

 

查看MySQL编码

1) 查看数据库(database)编码格式

mysql> show create database proxy;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| proxy    | CREATE DATABASE `proxy` /*!40100
DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+

 

2)查看数据库表(table)编码格式

mysql> show create table proxy_me;
| proxy_all | CREATE TABLE `proxy_me` (
  `ip` varchar(40) NOT NULL 
  `port` int(10) NOT NULL,
  `country` varchar(100) NOT NULL,
  `type` char(10) NOT NULL DEFAULT 'HTTP' 
  PRIMARY KEY (`ip`,`port`,`type`),
  KEY `index_update_time` (`update_time`)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8 |

 

总结

只有在MySQL中可以使用"utf-8"的别名"utf8",但是在其他地方一律使用大写"UTF-8",即

1) 在MySQL里,编码格式为 "utf8"

2) 在其它场景里,编码格式推荐使用 "UTF-8",或小写 "utf-8"

 

==============================

 

Python 编码规范

官方参考文档: Defining Python Source Code Encodings

在Python源码的头文件中要声明编码方式,几种常见写法如下:

#coding=utf-8 
#coding:utf-8
#-*- coding:utf-8 -*-

上面三种写法,怎样写才是有效地呢,优势有在哪呢? 

怎么声明编码格式呢?

如果在Python中我们并没有声明别的编码方式,就是以'ascii'编码将作为默认的编码方式。

为了定义源文件的编码方式,规范做法是编码声明应当被放在这个文件的第一行或者是第二行,例如:

#coding=<encoding name>

或者

#!/usr/bin/python
# -*- coding: <encoding name> -*-

或者

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

不管怎么样,这些在第一行或者第二行的声明都要符合正则表达式 

 "coding[:=]\s*([-\w.]+)"

所以我们就可以知道为什么使用冒号或者等号都可以了,如果声明的编码python不能识别就会报错,示例如下:

Examples

These are some examples to clarify the different styles for defining the source code encoding at the top of a Python source file:

示例1:python文件

With interpreter binary and using Emacs style file encoding        comment:

          #!/usr/bin/env python
         
# -*- coding: utf-8 -*-
          import os, sys
          ...

          #!/usr/bin/python
         
# -*- coding: iso-8859-15 -*-
          import os, sys
          ...

          #!/usr/bin/python
         
# -*- coding: ascii -*-
          import os, sys
          ...

 

示例2: 文本文件

Without interpreter line, using plain text:

          # This Python file uses the following encoding: utf-8
          import os, sys
          ...

 

示例3:python文件

Text editors might have different ways of defining the file's
       encoding, e.g.

          #!/usr/local/bin/python
          # coding: utf-8
          import os, sys
          ...         

          #!/usr/local/bin/python

          # coding=utf-8

          import os, sys

          ...

 

示例4:默认编码 'ascii'

Without encoding comment, Python's parser will assume ASCII
       text:

          #!/usr/local/bin/python
          import os, sys
          ...

 

示例5:错误写法

Encoding comments which don't work:

       Missing "coding:" prefix:

          #!/usr/local/bin/python
          # latin-1
          import os, sys
          ...

       Encoding comment not on line 1 or 2:

          #!/usr/local/bin/python
          #
          # -*- coding: latin-1 -*-
          import os, sys
          ...

       Unsupported encoding:

          #!/usr/local/bin/python
          # -*- coding: utf-42 -*-
          import os, sys
          ...

 

总结:

上述五种写法,推荐第1种和第3种,第5种都是错误示例