Python3自诩解决了编码问题,但还是有一系列的坑。本文就记录下前几天遇到的python3编码问题。mysql编码问题附带介绍。

python3 json串的编码

针对于包含中文的字典,如果想要正常显示中文,在dumps时,需配置参数ensure_ascii=False。举例:

a={"name":"中国"}

json.dumps(a)

'{"name": "\\u4e2d\\u56fd"}'

json.dumps(a,ensure_ascii=False)

'{"name": "中国"}'

针对于包含特定转义字符的字符串,如果想要正常解析,需要在loads时配置strict=False。举例:

json.loads('{"foo":"bar\nbaz"}')

Traceback (most recent call last):

File "", line 1, in

json.loads('{"foo":"bar\nbaz"}')

File "C:\Users\jonyguo\AppData\Local\Programs\Python\Python36\lib\json\__init__.py", line 354, in loads

return _default_decoder.decode(s)

File "C:\Users\jonyguo\AppData\Local\Programs\Python\Python36\lib\json\decoder.py", line 339, in decode

obj, end = self.raw_decode(s, idx=_w(s, 0).end())

File "C:\Users\jonyguo\AppData\Local\Programs\Python\Python36\lib\json\decoder.py", line 355, in raw_decode

obj, end = self.scan_once(s, idx)

json.decoder.JSONDecodeError: Invalid control character at: line 1 column 12 (char 11)

json.loads('{"foo":"bar\nbaz"}', strict=False)

{'foo': 'bar\nbaz'}

python3的字符串编码

python3中只有两种字符串,一是str,一是bytes。str经过encode变成bytes,bytes经过decode变成str。

有时从网络取出的包含中文的数据为unicode编码的字符串,可通过先编码在解码转化为中文:

a="\\u4e2d\\u56fd"

print(a)

\u4e2d\u56fd

a.encode().decode("unicode_escape")

'中国'

也可以通过repr将其转化为字符串,将两个反斜杠替换为一个反斜杠来解决这个问题:

a="\\u4e2d\\u56fd"

eval(repr(a).replace('\\\\', '\\'))

'中国'

python3 + apache的字符编码问题

python3脚本作为cgi供前端界面调用。遇到了一个很奇怪的问题,我通过编写的python脚本调用cgi时,编码一切正常,但是当我通过http调用时会出现一些问题。从数据库中取中文数据,返回前端显示一切都正常。但是当我把数据库中的中文与一些字符组成一个文件名,判断文件是否存在时,一直报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-49: ordinal not in range(128)。

刚开始以为是apache的编码问题,后来查看apache的编码也确定是utf8,不知所措。经google,查找到了原因。

https://www.raspberrypi.org/forums/viewtopic.php?t=65257 这个帖子里面有介绍到说:

The difference is that from the command line Python inherits your locale settings (probably LANG=fr_FR.UTF-8), whereas from Apache it inherits LANG=C. It knows that your strings are Unicode, but it can not print them in an ASCII environment.

说是通过python脚本调用的时候python继承的是locale 设置,为utf8,可正常显示(个人感觉这里可能说的有些不恰当,这里应该是采用python3自己的编码)。而apache继承的是LANG=C,为ascii,无法正常显示。按照其配置,在/etc/apache2/envvars中添加. /etc/default/locale(/etc/sysconfig/i18n)即可。配置后发现依然无法解决问题。

后又继续google,找到了解决方案。

https://stackoverflow.com/questions/9322410/set-encoding-in-python-3-cgi-scripts

Add PassEnv LANG line to the end of your /etc/apache2/apache2.conf or .htaccess.

Uncomment . /etc/default/locale line in /etc/apache2/envvars.

Make sure line similar to LANG="en_US.UTF-8" is present in /etc/default/locale.

就是在apache2的配置文件中添加一行:PassEnv LANG 即可。要确保LANG为utf8。

mysql编码问题

查看当前的数据库编码:

mysql> show variables like 'character%';

+--------------------------+--------------------------------------------------------------+

| Variable_name | Value |

+--------------------------+--------------------------------------------------------------+

| character_set_client | latin1 |

| character_set_connection | latin1 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | latin1 |

| character_set_server | latin1 |

| character_set_system | utf8 |

| character_sets_dir | /usr/local/mysql-5.1.46-linux-x86_64-glibc23/share/charsets/ |

+--------------------------+--------------------------------------------------------------+

从上图可知,数据库的编码为utf8.

● character_set_client:无论客户端传递的是什么编码的数据,服务器都当成该编码来处理,例如该编码为UTF8,那么如果客户端发送过来的数据不是UTF8,那么就会出现乱码;

● character_set_connection:通过该编码与client一致!该编码不会导致乱码!当执行的是查询语句时,客户端发送过来的数据会先转换成connection指定的编码。但只要客户端发送过来的数据与client指定的编码一致,那么转换就不会出现问题;

● character_set_database:数据库默认编码,在创建数据库时,如果没有指定编码,那么默认使用database编码;

● character_set_filesystem:可以理解为文件的最终存储形式,是二进制形式的;

● character_set_server:MySQL服务器默认编码;

● character_set_results:MySQL会把数据转换成该编码后,再发送给客户端,例如该编码为UTF8,那么如果客户端不使用UTF8来解读,那么就会出现乱码,说明客户端必须使用result指定的编码来解码;

一条数据库连接的过程如下:

client --> connection --> server --> connection --> result

其实只要保证client、connection和result 一致就不会出现乱码问题。

通过set names utf8 保证client、connection和result 的编码一致:

mysql> show variables like 'character%';

+--------------------------+--------------------------------------------------------------+

| Variable_name | Value |

+--------------------------+--------------------------------------------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | latin1 |

| character_set_system | utf8 |

| character_sets_dir | /usr/local/mysql-5.1.46-linux-x86_64-glibc23/share/charsets/ |

+--------------------------+--------------------------------------------------------------+

python mysql 编码方式,Python3编码与mysql编码介绍相关推荐

  1. mysql二进制方式_MySQL数据库之MySql二进制连接方式详解

    本文主要向大家介绍了MySQL数据库之MySql二进制连接方式详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 使用mysql二进制方式连接 您可以使用MySQL二进制方式进 ...

  2. 修改mysql编码方式centos_CentOS下修改mysql数据库编码为UTF-8(附mysql开启远程链接和开放3306端口)...

    楼主在配置好linux云服务器的jdk,tomcat,mysql后,当要开始部署项目是,忽然意识到一个很严重的问题,那就是数据库的编码问题,自安装完成后并未修改数据库的额编码....下面就来讲说lin ...

  3. pycharm与python连接_pycharm2017实现python3.6与mysql的连接

    本文为大家分享了pycharm2017上实现python3.6与mysql的连接方法,供大家参考,具体内容如下 与其他的IDE不同,pycharm不需要额外下载mydqldb包等,pycharm里可以 ...

  4. v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码

    Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https ...

  5. linux下安装mysql的方式_linux下安装mysql的两种方式

    linux下安装mysql的两种方式 1 源码安装 1 创建mysql用户: useradd mysql passwd mysql 2 解压缩下载的mysql包: tar -zxvf mysql-5. ...

  6. [python运维] 使用python3制作一个mysql压测小工具!

    ​​0x01 argparse模块​​ ​ argparse是Python 标准库中推荐的命令行解析模块,他可以实现给出参数提示和接收用户输入的参数,类似linux的命令行功能:​ [root@yun ...

  7. java ascii 编码方式_JAVA 的ASCII字符编码一览表

    JAVA 的ASCII字符编码一览表 二进制 十进制 十六进制 缩写 可以显示的表示法 名称/意义 0000 0000 0 00 NUL ␀ 空字符(Null) 0000 0001 1 01 SOH ...

  8. MySQL查看与修改编码方式(mysql、数据库、表)

    mysql默认的编码方式是latin1,通过以下命令查看 show variables like 'char%'; 或者: show variables like 'character%'; mysq ...

  9. python中的编码方式

    说明 这里我们以python2.7为例讲解python的编码方式 指定执行编码方式 python2.7的默认编码方式为ascii字符集,这里所说的编码方式指执行编码方式,在编程过程中,有三个地方都涉及 ...

最新文章

  1. C内存2:程序是如何运行的
  2. WCF与ASP.NET Core性能比较
  3. 初步了解学习将传统单机应用改造成Dubbo服务的过程
  4. RRT,RRT*,A*,Dijkstra,PRM算法
  5. u盘数据恢复的原理_日臻薄技 | 电脑回收站数据恢复的三个方法
  6. ImageJ Nikon_科研人必备图像处理软件—ImageJ软件分享
  7. Opencv 图片缩小尺寸原理
  8. 解压deb_Linux填坑记:很全面的解压和压缩命令集合
  9. 简单介绍一下vue2.0
  10. Oracle的三种高可用集群方案
  11. Atitit SpringCache缓存使用 艾提拉 attilax总结 1. Spring的抽象已经做得够好了,适合于大多数场景,非常复杂的就需要自己AOP实现了。 1 1.1. 设置配置文件支持
  12. 多格式无水印录屏软件
  13. 什么是网络分析仪?它的重要技术指标有哪些?
  14. 常见软件非功能性需求描述案例
  15. golang 获取本周 上周的时间
  16. linux 端口不通,linux的端口不通怎么解决
  17. java and android_java jvm和android DVM区别
  18. vscode 下载地址
  19. 一款基于企业微信的固定资产管理软件
  20. 【运筹学】线性规划 图解法 ( 唯一最优解 | 无穷最优解 | 无界解 | 无可行解 )

热门文章

  1. 003_FastDFS分布式横向扩容和纵向添加storage
  2. mq 接口 java_Rabbitmq Java Client Api详解
  3. mflac文件解析工具_9 个爱不释手的 JSON 工具
  4. Java数据结构和算法:234树和外部存储
  5. android游戏加载,Android 游戏引擎libgdx 资源加载进度百分比显示案例分析
  6. ad域帐号登录提示无法处理请求_面试官:说一下单点登录的几种实现方式
  7. c99变长数组_你学过数组,那你知道柔性数组吗?
  8. linux 爬虫工具,技术|如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
  9. java8 虚拟机调优_Java虚拟机调优(八)-典型配置举例2
  10. html5下拉列表默认值,element-ui中的select下拉列表设置默认值方法_简单_前端开发者...