Python3中文字符编码问题

栏目: Python · 发布时间: 6年前

内容简介:最近在尝试 Python Web方面的开发尝试,框架使用的是Django,但是在读取数据库并页面展示的时候,出现了中文编码的问题。我们看下面一段代码,获取小说章节列表:

Python3中文字符编码问题

前言

最近在尝试 Python Web方面的开发尝试,框架使用的是Django,但是在读取数据库并页面展示的时候,出现了中文编码的问题。

问题

我们看下面一段代码,获取小说章节列表:

def main(request):
    sql = "SELECT id,title FROM novel LIMIT 10;"
    result = mysql.getAll(sql)
    context = {'novel_list': result}
    return render(request, 'novel_list.html',  context)

页面输出:

{% for novel in novel_list %}
    <a href="/chapter/{{novel.id}} "><li>{{ novel.title }}</li></a>
{% endfor %}

如果不加任何转换,页面上显示的中文将会是字节码。

解决

这里我们举一个稍微简单的例子,dict是数据库中查询出来的数据:

import json
dict = {'id': 1, 'title': b'\xe7\xac\xac\xe4\xb8\x80\xe7\xab\xa0 \xe7\xa7\xa6\xe7\xbe\xbd'}
dup = json.dumps(dict ,ensure_ascii=False)
print(dup)

Python2执行输出:

{"id": 1, "title": "第一章 秦羽"}

Python3执行报错:

TypeError: Object of type bytes is not JSON serializable

查询了半天,最终解决方案:

安装模块:

pip3 install numpy

最终代码:

import json
import numpy as np


class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, bytes):
            return str(obj, encoding='utf-8');
        return json.JSONEncoder.default(self, obj)

dict  = {'id': 1, 'title': b'\xe7\xac\xac\xe4\xb8\x80\xe7\xab\xa0 \xe7\xa7\xa6\xe7\xbe\xbd'}
dup = json.dumps(dict , cls=MyEncoder, ensure_ascii=False, indent=4)
print(dup)

你也可以for循环,然后单个转码:

sql = "SELECT id,title FROM novel LIMIT 10;"
result = mysql.getAll(sql)
for each in result:
    ach['title'] = each['title'].decode('utf-8')

字符串通过编码转换为字节码,字节码通过解码转换为字符串:

str--->(encode)--->bytes,bytes--->(decode)--->str

decode和encode详解

  • decode 解码,在已知字符串编码的情况下,转码为unicode ,比如 s.decode('utf-8'),结果为unicode
  • encode 编码,在已有unicode的情况下,转码为其它编码,比如 u.encode('utf-8'),结果为utf-8

Web输出

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。

Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:

  • json.dumps(): 对数据进行编码。
  • json.loads(): 对数据进行解码。
def main(request):
    sql = "SELECT id,title FROM novel LIMIT 10;"
    result = mysql.getAll(sql)
    # 转Json对象
    result = json.dumps(result, cls=MyEncoder, ensure_ascii=False, indent=4)
    # 转字典类型
    result = json.loads(result)
    context = {'novel_list': result}
    return render(request, 'novel_list.html',  context)

参数详解

json.dumps(result, cls=MyEncoder, ensure_ascii=False, indent=4)

indent

根据数据格式缩进显示,读起来更加清晰,indent的数值,代表缩进的位数。

ensure_ascii

如果无任何配置,或者说使用默认配置, 输出的会是中文的ASCII字符吗,而不是真正的中文。 这是因为json.dumps 序列化时对中文默认使用的ascii编码。

{
    "id": 1,
    "title": "\u7b2c\u4e00\u7ae0 \u79e6\u7fbd"
}

cls

dict类型的数据(存在中文),在 python 2中是可以转化的,但是在python3中存在序列化问题:

TypeError: Object of type bytes is not JSON serializable

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Designing Web Navigation

Designing Web Navigation

James Kalbach / O'Reilly Media / 2007-8-15 / USD 49.99

Thoroughly rewritten for today's web environment, this bestselling book offers a fresh look at a fundamental topic of web site development: navigation design. Amid all the changes to the Web in the pa......一起来看看 《Designing Web Navigation》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具