Python 字符编码问题

参考文档 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819196283586a37629844456ca7e5a7faa9b94ee8000

ASCII、Unicode和UTF-8在现在计算机系统通用的字符编码工作方式:
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

  • 推荐的使用方式
    在 python 文件顶部习惯上会指定编码 #coding:utf8 ,所以在文档中出现的内容全部使用
    UTF-8 处理

  • unicode 与 UTF-8 转换方法

    • u’xxx’转换为UTF-8编码的’xxx’用encode(‘utf-8’)方法

      1
      2
      3
      4
      >>> u'ABC'.encode('utf-8')
      'ABC'
      >>> u'中文'.encode('utf-8')
      '\xe4\xb8\xad\xe6\x96\x87'
    • 把UTF-8编码表示的字符串’xxx’转换为Unicode字符串u’xxx’用decode(‘utf-8’)方法

      1
      2
      3
      4
      5
      6
      >>> 'abc'.decode('utf-8')
      u'abc'
      >>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
      u'\u4e2d\u6587'
      >>> print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
      中文
  • json 在使用中的字符问题

json 在 dumps 之后,再 Loads 回来,会变成 unicode,所以按照上面的习惯,
在使用的时候应该进行 unicode -> utf-8 的转换 u'ABC'.encode('utf-8')

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@serv ~]# python
Python 2.7.3 (default, Jun 1 2015, 14:36:54)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {'a': '中文asdf123'}
>>> print type(d['a'])
<type 'str'>
>>> dd = json.dumps(d)
>>> print dd
{"a": "\u4e2d\u6587asdf123"}
>>> d1 = json.loads(dd)
>>> print d1
{u'a': u'\u4e2d\u6587asdf123'}
>>> print type(d1)
<type 'dict'>
>>> print d1['a']
中文asdf123
>>> print type(d1['a'])
<type 'unicode'>