Home >Backend Development >Python Tutorial >Python2.7 中文字符编码,使用Unicode时,选择什么编码格式?

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

WBOY
WBOYOriginal
2016-06-06 16:22:271112browse

回复内容:

关于编码和乱码的问题,我简单讲一下。

通常问这类问题的人是混淆了若干个不同的概念,并且他们自己也没有意识到自己混淆了这些概念的。

  1. 终端显示字符的编码(windows下终端是cmd,linux下是各种terminal,远程登录是putty或者xshell)
  2. shell环境的编码。比如中文版windows用的是gbk(向下兼容gb2312),大多数linux发行版使用的是utf-8(LANG=zh_CN.UTF-8)。
  3. 文本文件的编码。这个通常取决于你的编辑器,而且有的编辑器支持多种编码的话,你可以在文本开头位置指定编辑器使用特定编码。比如# -*- coding: utf8 -*-,vim看到这行会默认将这个脚本认定为utf-8兼容编码格式。
  4. 应用程序的内部编码。一个字符串,作为数据只是一个字节数组,但是作为字符的数组,就有一个解析方式。java和python的内部字符编码是utf-16,python和java都支持用不同的编码来对字节数组进行decode来得到字符数组。

拿题主的问题来解释一下。

我在ubuntu kylin中文环境下默认terminal中做了同样的实验,但是结果和题主恰好相反:
Python2.7 中文字符编码,使用Unicode时,选择什么编码格式?
Python2.7 中文字符编码,使用Unicode时,选择什么编码格式?

看见没有?

题主和我都没有说谎,这是为什么呢?
因为
<code class="language-text">unicode("汉字","gb2312")
</code>
我觉得关键是区分“字节”和“字符”的概念,还要知道一点点字体的常识。

“字符”可以看成是一个抽象概念,如当楼主说“汉字”,其实他意思是表达的是表示这么一个概念的两个字符。

当字符在计算机中表示的时候,需要编码成二进制(字节),于是就出现了不同的编码方式,如 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 时程序做了哪些转换。
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn