python2.7中文字符编码,使用unicode时,选择什么编码格式?

回复内容:
关于编码和乱码的问题,我简单讲一下。通常问这类问题的人是混淆了若干个不同的概念,并且他们自己也没有意识到自己混淆了这些概念的。终端显示字符的编码(windows下终端是cmd,linux下是各种terminal,远程登录是putty或者xshell)shell环境的编码。比如中文版windows用的是gbk(向下兼容gb2312),大多数linux发行版使用的是utf-8(lang=zh_cn.utf-8)。文本文件的编码。这个通常取决于你的编辑器,而且有的编辑器支持多种编码的话,你可以在文本开头位置指定编辑器使用特定编码。比如# -*- coding: utf8 -*-,vim看到这行会默认将这个脚本认定为utf-8兼容编码格式。应用程序的内部编码。一个字符串,作为数据只是一个字节数组,但是作为字符的数组,就有一个解析方式。java和python的内部字符编码是utf-16,python和java都支持用不同的编码来对字节数组进行decode来得到字符数组。拿题主的问题来解释一下。我在ubuntu kylin中文环境下默认terminal中做了同样的实验,但是结果和题主恰好相反:看见没有?题主和我都没有说谎,这是为什么呢?因为

unicode(“汉字”,”gb2312″)

我觉得关键是区分“字节”和“字符”的概念,还要知道一点点字体的常识。“字符”可以看成是一个抽象概念,如当楼主说“汉字”,其实他意思是表达的是表示这么一个概念的两个字符。当字符在计算机中表示的时候,需要编码成二进制(字节),于是就出现了不同的编码方式,如 gbk, utf-8 等。如 kenneth 展示的,“汉字”这两个字符在 gbk 中编码为 0xbabad7d6,而在 utf-8 中编码为 0xe6b189e5ad97。最终显示时,则还要根据所使用的字体,把抽象的字符转化成具象的图像。所以,楼主的第一个问题在于虽然你看到的是“汉字”的图像,但其在该脚本的源文件中的字节编码可能是任何一种——在 windows 下是 gbk 或 gb18030 等。于是 python 看到的是一串 gbk / gb18030 编码的字节,而你试图告诉 python 这是 utf-8 编码的,那自然报错了。第二个问题,对 sql server 不熟,不过看起来原因是当你把从数据库读出的数据(字节形式,可能是 gbk 等非 unicode 编码)放入 unit 这个变量的时候,程序错把非 unicode 编码的字节当成 unicode 编码解释了。那么排查思路应该是搞清楚数据在读出时是什么编码(这可能跟数据存入时的编码相关,也可能跟数据库配置有关),以及存入 unit 时程序做了哪些转换。

Posted in 未分类

发表评论