Tag:中文乱码

Tag (中文乱码)'s result:

记一次python2.7中文乱码的解决历程

0x00 前言 最近用python写个小爬虫,想回复下feeling,却被中文乱码的问题搞得寝食难安,不过经过两天的各种搜索尝试,还是解决掉了这个问题。 0x01 乱码前奏 我的环境:debian8+python2.7 那是一个风雨交加的夜晚,本人打算写个小小的爬虫,当我高兴地按下回车,控制台输出 UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position……,这好办,因为python默认是ascii编码,只有1个字节,当然无法编码中文,加上几行就ok: import sys reload(sys) sys.setdefaultencoding(‘utf-8’) 好,再来一次,冥冥之中我觉得事情不会这么顺利,果然,中文乱码隆重登场! 0x02 中文乱码 看见中文乱码,如下图: 第一感觉,稳住别乱!Python2.7中文乱码就像家常便饭,都是见过大风大浪的人了…….,控制台和写入文件夹一样的乱码,有了PHP中文乱码的经验,先看看哪里的编码没统一吧,如下: 1.python源码编码:utf-8 2.python源码的文件编码:utf-8 3.Python系统编码:utf-8(见0x01) 4.控制台编码:utf-8 5.文件系统编码:utf-8 6.爬取的json文件编码:貌似gbk 为什么说貌似呢,因为那是一个json文件,没META,但是看了下别的网页都是gbk。那应该就是这个问题了,那也好办,heroName[n].decode(‘gbk’).encode(‘utf-8’)就行咯,再运行一次,心想这下该没问题了,好的,真的没乱码了,如图: 但是输出的并不是人名啊,而是一串无意义的中文,这就奇怪了,输出了中文就证明解码应该没错了啊,那试试用gb2312解码 heroName[n].decode(‘gb2312’).encode(‘utf-8’),结果: UnicodeDecodeError: ‘gb2312’ codec can’t decode bytes in position 4-5,接着又各种decode各种encode,几乎都组合了一遍还是各种乱…… 0x03 一行解决 经过各种搜索,突然发现可以把get下来的网页再encoding,于是尝试加了这句: heroListHtml.encoding = ‘utf-8’,这下都是utf-8了,该和谐了吧,于是第n次运行,终于见到了正常的中文!从来都没觉得原来中文是这么诱人…… 0x04 结语 遇到乱码,别乱,没什么特殊的话就是编码不统一的问题了,仔细找,多搜索,应该就ok了,有时候,与其找问题原因,还不如避开问题,python2这个编码问题真是烦人啊,py3这个编码就好多了,不用decode/encode,直接中文变量都没事。最后,送神图一张 # # #             ┌─┐                  ┌─┐ #      ┌──┘ ┴───────┘ ┴──┐ #       │                                          │ #       │                ───                  │ #       │  ─┬┘                └┬─        │ #       │                                          │ #       │                 ─┴─                 │ #       │                                          │ #       └───┐                    ┌───┘ #                 │                     │ #                  │                    │ #                  │                    │ #                  │                    └──────────────┐ #                  │                                                             │ #                  │                                                             ├─┐ #                  │                                                             ┌─┘ #                  │                                                             │ #                  └─┐  ┐  ┌───────┬──┐  ┌──┘ #                       │ ─┤ ─┤                 │ ─┤ ─┤ #                       └──┴──┘             └──┴──┘ #                                      神兽保佑 ! #                                      永无乱码 ! #/

PHP+MYSQL中文乱码解决历程

问题描述: 1.php输出mysql里的中文数据出现乱码。 2.mysql存储中文数据乱码。 ******************************************* 乱码问题一般就是编码不统一,只要把各部分的编码统一就ok了,但是就是各部分编码统一很烦人,写php时就遇到上述问题,记录一下解决过程,供大家参考。 这里以统一utf-8编码为例: 1.网页显示编码声明为utf-8:<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> 2.保存的文件用utf-8编码:另存为-utf-8-replace 3.thinkphp的配置 ‘db-charset’ => ‘utf8’ 4,数据库编码改为utf8:mysql>alter database <数据库名> character set utf8; 5.数据库表名改为utf8:mysql>alter table <表名> character set utf8; (最好在创建库和表就设为utf8,不然可能还要改字段的编码) 首先保证上述5点编码统一! mysql> show variables like ‘character_set_database’;查看数据库编码 mysql> show create table <表名>;查看数据表编码 都是utf8没问题 但是看php输出的中文数据一直是乱码,看了网上的资料才发现cmd的编码是gbk,而我的中文数据是从cmd直接insert into的(在cmd中看正常不乱码),所以还是乱码,接着我从php添加中文数据,输出乱码问题解决! 由此引发新问题,当我在cmd中查看数据库中刚刚从php添加的中文数据又乱码了,而且一个中文就变成一个?号,其余正常。 先了解下相关知识: show variables like ‘character%’;查看当前数据库的相关编码集 client    为客户端使用的字符集。 connection    为连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型则按照服务器端默认的字符集设置。 database    为数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。 results    为数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。 server    为服务器安装时指定的默认字符集设定。 system    为数据库系统使用的字符集设定。 猜想可能是由于mysql用utf8存储数据,而cmd用gbk编码,所以在cmd中看就乱码了,尝试set names gbk;改变connection,results,client的编码为gbk,再次查看还是乱码(而且问号更多了……)。 现在先在my.cnf中加入: [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 把connection,result,client都先设置为utf8。 发现中文乱码更奇怪了,但是用php新增的那个中文数据倒是没乱码了,以前用cmd新增的数据就是乱码(a…)。 感觉越来越乱了。 猜测可能是php用utf8新增数据而cmd新增的数据是gbk所以乱码,尝试用php再新增一条中文数据,结果发现php输出正常,在cmd中查看也正常,所以是cmd中用gbk insert into导致乱码,在cmd中再添加一条中文数据发现中文也正常了,真是神奇。 这个中文乱码问题真的非常烦人,不过勉强解决了文章开始的两个问题,先这样吧!