今天在写python CGI脚本测试将网页表单中填写的信息提交后存储到mysql中时, 碰到了汉字显示乱码的问题。 因为之前在学习mysql的时候用insert向数据库中插入汉字时出现乱码, 解决此问题是修改数据库的字符编码。。所以在此次测试之前, 就已经建表时设置了默认字符为utf-8. 可是, 在将表单中的汉字存储到数据库时, 数据库中每条记录的汉字依然是显示乱码。 因为感觉一定不是数据库的问题了, 所有就各种查阅关于网页提交表单内容时读汉字时候进行编码修改。 我将网页的编码设置为utf-8, 在查阅资料的过程中, 了解到, 网页表单中的内容会按照所给编码格式传输到服务器中的python脚本, 然而utf-8格式的汉字在python中是一十六进形式存储的, 比如: 你好吗, 如果在python交互模式下查看
每个汉字用三个十六进制字节表示。。如果要将其正确的显示出汉字, 就要使用print, 因为print在显示汉字时, 会把内存中存储的内容转换为正确的显示格式。
所以在python脚本中将从表单中获取的输入的汉字存储到数据库时, 其实是将这十六进制数存入了数据库。。。数据库中依然显示乱码, 因为之前修改数据库的编码时, 曾把character_set_client、character_set_database、character_set_server等变量的内容由latin1改为了utf-8, 在无意的尝试中, 又将这些变量的值改回了latin1, 结果汉字不再显示为乱码了。 无意中尝试居然解决了问题。。 之后我又尝试了几次, 发现, 只要将数据库中表的字符格式设置为可以显示汉字的utf-8格式, 而对于数据库中的其他字符变量不做修改, 数据的显示能正常显示。。
而之后在将数据从数据库中提取出来显示在网页的时候, 因为是直接将row = fetchone()中的数据print row, 打印出来的, 网页中汉字显示的是十六进值形式, 脑子有些转不过来弯了, 以后又是编码问题, 搞了老一会也没有头绪,
其实只要在脚本中将查询的每一个字段内容用print打印出来就行了, print row[0], print row[1]...。 这点问题, 居然让我搞了一下午, 唉。。。。。