Python、Unicode和中文
python的中文问题一直是困扰新手的头疼问题,这篇文章将给你详细地讲解一下这方面的知识。当然,几乎可以确定的是,在将来的版本中,python会彻底解决此问题,不用我们这么麻烦了。
先来看看python的版本:
>>> import sys
>>> sys.version
'2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]'
(一)
用记事本创建一个文件ChineseTest.py,默认ANSI:
s = "中文"
print s
测试一下瞧瞧:
E:/Project/Python/Test>python ChineseTest.py
File "ChineseTest.py", line 1
SyntaxError: Non-ASCII character '/xd6' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho
n.org/peps/pep-0263.html for details
偷偷地把文件编码改成UTF-8:
E:/Project/Python/Test>python ChineseTest.py
File "ChineseTest.py", line 1
SyntaxError: Non-ASCII character '/xe4' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho
n.org/peps/pep-0263.html for details
无济于事。。。
既然它提供了网址,那就看看吧。简单地浏览一下,终于知道如果文件里有非ASCII字符,需要在第一行或第二行指定编码声明。把ChineseTest.py文件的编码重新改为ANSI,并加上编码声明:
# coding=gbk
s = "中文"
print s
再试一下:
E:/Project/Python/Test>python ChineseTest.py
中文
正常咯:)
(二)
看一看它的长度:
# coding=gbk
s = "中文"
print len(s)
结果:4。
s这里是str类型,所以计算的时候一个中文相当于两个英文字符,因此长度为4。
我们这样写:
# coding=gbk
s = "中文"
s1 = u"中文"
s2 = unicode(s, "gbk") #省略参数将用python默认的ASCII来解码
s3 = s.decode("gbk") #把str转换成unicode是decode,unicode函数作用与之相同
print len(s1)
print len(s2)
print len(s3)
结果:
2
2
2
(三)
接着来看看文件的处理:
建立一个文件test.txt,文件格式用ANSI,内容为:
abc中文
用python来读取
# coding=gbk
print open("Test.txt").read()
结果:abc中文
把文件格式改成UTF-8:
结果:abc涓枃
显然,这里需要解码:
# coding=gbk
import codecs
print open("Test.txt").read().decode("utf-8")
结果:abc中文
上面的test.txt我是用Editplus来编辑的,但当我用Windows自带的记事本编辑并存成UTF-8格式时,
运行时报错:
Traceback (most recent call last):
File "ChineseTest.py", line 3, in <module>
print open("Test.txt").read().decode("utf-8")
UnicodeEncodeError: 'gbk' codec can't encode character u'/ufeff' in position 0: illegal multibyte sequence
原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:
# coding=gbk
import codecs
data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
print data.decode("utf-8")
结果:abc中文
(四)一点遗留问题
在第二部分中,我们用unicode函数和decode方法把str转换成unicode。为什么这两个函数的参数用"gbk"呢?
第一反应是我们的编码声明里用了gbk(# coding=gbk),但真是这样?
修改一下源文件:
# coding=utf-8
s = "中文"
print unicode(s, "utf-8")
运行,报错:
Traceback (most recent call last):
File "ChineseTest.py", line 3, in <module>
s = unicode(s, "utf-8")
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data
显然,如果前面正常是因为两边都使用了gbk,那么这里我保持了两边utf-8一致,也应该正常,不至于报错。
更进一步的例子,如果我们这里转换仍然用gbk:
# coding=utf-8
s = "中文"
print unicode(s, "gbk")
结果:中文
翻阅了一篇英文资料,它大致讲解了python中的print原理:
When Python executes a print statement, it simply passes the output to the operating system (using fwrite() or something like it), and some other program is responsible for actually displaying that output on the screen. For example, on Windows, it might be the Windows console subsystem that displays the result. Or if you're using Windows and running Python on a Unix box somewhere else, your Windows SSH client is actually responsible for displaying the data. If you are running Python in an xterm on Unix, then xterm and your X server handle the display.
To print data reliably, you must know the encoding that this display program expects.
简单地说,python中的print直接把字符串传递给操作系统,所以你需要把str解码成与操作系统一致的格式。Windows使用CP936(几乎与gbk相同),所以这里可以使用gbk。
最后测试:
# coding=utf-8
s = "中文"
print unicode(s, "cp936")
结果:中文
转载于:https://blog.51cto.com/7492110/1586560
相关文章:

提高mysql性能的开源软件
今天发现一个开源软件,看介绍可以提高mysql的性能,这个东西就是Google的开源TCMalloc库,于是拿来装了下看看效果.这个软件下载地址是:http://code.google.com/p/google-perftools/downloads/list,我用的是最新版的google-perftools-1.4.tar.gz.1.安装过程:#tar zxvf google-per…

一款比较实用齐全的jQuery 表单验证插件
一款比较实用,并且验证类型齐全的jQuery表单验证插件.英文版原作者Vanadium,由我做中文整理.E文水平有限,如果翻译的有问题的,请大家指出,在此感谢~可以验证哪些? 文字,日期,邮箱,网址,数字,AJAX用户名验证以及自定义的正则等等几乎所有我们要用到的验证.不多说,看DEMO吧: 点此…

[原]VS2012编译GLEW 1.11
1、到http://glew.sourceforge.net/下载源代码 2、使用vs2012打开build下vc6的glew.dsw ,自动生成2012工程(一路点确定)特别注意:不要使用build下的vc12之类的 本人亲测不好使 坑了我很久 3、直接生成解决方案,会在根目…

长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 8月10日晚,雷军年度演讲及小米秋季发布会在线上召开,此次发布会足足讲了三个小时,不仅介绍了小米的目前市场状况,还分享了新品以及小米机器人实验室的第一款产品——机器狗「铁…

java中图片文件的判断
javax.imageio 类 ImageIO BufferedImage bi ImageIO.read(resFile);//resFile --- InputStreamif(bi null){ System.out.println(此文件不为图片文件); }try {//判断是否为图片文件并且返回图片的格式!ImageInputStream iis ImageIO.createImageInputStream(o)…

jQuery中常用的函数方法总结
jQuery中为我们提供了很多有用的方法和属性,自己总结的一些常用的函数,方法。个人认为在www.21kaiyun.com的紫微斗数星座在线排盘开发中会比较常用的,仅供大家学习和参考。 事件处理 ready(fn) 代码:$(document).ready(functi…

使用editcap命令将ERF格式转换为pcap格式
editcap是Wireshark的一个组件,在Windows平台下,只要完成Wireshark的安装,就可以在安装目录中看到editcap.exe。editcap.exe需要在命令行中使用。 对于用Endace DAG捕捉卡捕获的数据包,一般来说,都是erf格式的。ERF格式…

中关村开源创新大赛-达闼赛道如火如荼进行中
导语为庆祝中国共产党成立100周年,中关村软件园携手云端机器人运营商达闼,联合举办了中关村开源创新大赛-达闼赛道,暨“不忘初心 AI创时代”达闼智能服务机器人编舞大赛。在小姜的灵动舞姿下,今天,达闼赛道正式启动&am…

国际版Azure搭建Windows多种类型×××_三.配置SSTP ×××连接服务
安全套接字隧道协议(SSTP)是一种新的***隧道形式,具有允许流量通过阻止PPTP和L2TP / IPsec流量的防火墙的功能。 SSTP提供了一种在HTTPS协议的SSL通道上封装PPP流量的机制。 PPP的使用允许支持强认证方法,如EAP-TLS。 使用HTTPS意…

超强的jquery极品插件--色彩选择器类/ 右键菜单类/ 图片新闻flash展示类
Farbtastic Farbtastic是一个color picker插件。它能够在一个页面中加入多个颜色选择控件,然后每个控件关联到页面中的一个元素比如:文本输入框。FarbtasticjQuery Color Picker 21世纪开运网在线排盘星座就成功运用这些技巧,www.21kaiyun.co…

张口闭口就是焦虑,现在的程序员怎么了?
【CSDN 编者按】在网上,我们经常会看到各类程序员的吐槽,学历焦虑、大厂焦虑充斥着手机屏幕,本文作者从这一角度出发,用质朴的文字告诉年轻一代程序员一个事实:慢慢走好编程每一步,不要害怕更不用着急&…

epoll 的实现原理以及与poll,select 的对比
最近面试的时候 被问到epoll的问题,就下来查一查,看到有篇文章不错,就记录下来,供大家参考学习。 以一个生活中的例子来解释. 假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你…

js 字符串转换成数字的 三种方法
在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形式的.在网上找了一下js字符串转数字的文章,这个比较全方法主要有三种 转换函数、强制类型转换、利用js…

Web 开发与设计之 Google 兵器谱
Google 的使命是 Web,在 Google 眼中,未来的一切应用都将 Web 化,一直以来,Google 为 Web 开发与设计者推出了大量免费工具,让他们更好地创建,维护,改善他们的 Web 站点,这些工具包含…

html5新标签使用
HTML 5 视频标签<video> <video width"320" height"240" controls"controls"><source src"/i/movie.ogg" type"video/ogg"><source src"/i/movie.mp4" type"video/mp4">Your b…

调查:“AI红娘”来了,有一半人选择相信TA
作者:REN来源:数据实战派七夕AI红娘来了前言你会相信人工智能(AI)给你推荐的约会对象吗?最近,卡巴斯基的一项全球调查显示,在使用交友或约会软件时, 44% 的受访者愿意接受 AI 或算法…

Mysql技术内幕——InnoDB存储引擎
一.mysql体系结构和存储引擎 1.1、数据库和实例的区别 数据库:物理操作系统或其他形式文件类型的集合。在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件。 数据库实例:由数据库后台进程/线程以及一个共…

jQuery插件开发 - 其实很简单
【前言】jQuery已经被广泛使用,凭借其简洁的API,对DOM强大的操控性,易扩展性越来越受到web开发人员的喜爱,我在社区也发布了很多的jQuery插件,经常有人询问一些技巧,因此干脆写这么一篇文章给各位jQuery爱好…

直接选择排序算法
直接选择排序算法 1、选择排序 #include <stdio.h> #include <stdlib.h> #define N 5 //排序的数据个数 typedef struct Num {int data[N-1];int length; }Num;int main(int argc, char *argv[]) {int i,j,min;struct Num La;printf("请输入您要排序的数字序…

大厂的面试官是如何挑人的?
马上就又要到金九银十求职的黄金期了,最近找了很多资深面试官聊天,他们说其实他们每天都要面试考核很多应聘者,但是通过的人却寥寥无几。。为了帮助大家更好的了解大厂面试的知识方向,特别拿出了某大厂大佬整理的非常全面的大厂 A…

使用Mono管理Coyote Linux
Coyote是一个个人防火墙配置Linux的目的是为了保护家庭或教育网络. 这个防火墙产品牌的个人及教育用途,并提供免费下载:http://coyotelinux.com/ CoyoteLinux uses Mono for syadmin tools http://www.coyotelinux.com.cn/index.htm 本文转自 张善友 51CTO博客&…

介绍几款浏览器兼容性测试工具
昨天和朋友聊到了有关浏览器兼容性的问题,在开发中有时的确很让人苦恼,我向他推荐了几款测试浏览器兼容的工具,分享给大伙,有什么更好的工具或是解决方法还希望大家拿出来晒一晒。 IETester 这是我最先用的测试浏览器兼容性的工…

关于android.view.WindowLeaked(窗体泄露)的解决方案
虽然是小问题一个,但也困扰了我一段时间,现在记下来,给自己做个备忘,也可以给其他人一个参考 Java代码 view plaincopy to clipboardprint? 01-08 01:49:27.874: ERROR/WindowManager(473): Activity com.photos.MainActivity …

英伟达推出全球首个元宇宙平台,豪砸数亿是为什么?
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) NVIDIA 在 SIGGRAPH 推出首个全球元宇宙平台,并赢得了最佳展示奖。目前处于公测阶段,它对 NVIDIA RTX 和 GeForce RTX GPU 用户免费开放。用户在安装完 NVIDIA Studio 驱动程序后,即可获得…

route命令相关整理
目录: 1. 使用背景 2. route命令 2.1 打印路由信息 2.2 删除路由信息 2.3 添加路由信息 3. 应用实例 3.1 详解案例 3.2 内外网同时上网办法集锦 4、“路由添加失败,找不到元素” 1. 使用背景 需要接入两个网络,一个是部署环境所在内网…

ASP.NET画图控件 Chart Control 免费控件
.NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用,一直没有玩玩,闲来无事,简单研究了下,感觉功能真的很强大,基本上可以满足各种图表的应用,感觉这么好…

一步步学敏捷开发:开篇
一步步学敏捷开发:开篇 http://www.cnblogs.com/jetlian/p/3913687.html

算法也是颜值控,Twitter AI更青睐肤白貌美图
【CSDN 编者按】这是不是一个看脸的世界,谁都说不准,但是近期有研究人员发现,Twitter有这样一种AI算法:更青睐于身材好、皮肤白的年轻人的图片,哪怕这些图片经美图软件加工过。具体的情况究竟如何?下面这篇…

esxi4.1使用IDE格式磁盘
1、今天用workstation的“import and export”工具将DataOnTap系统迁移到esxi4.1下面了(具体转换方法可以参考http://taotao1240.blog.51cto.com/731446/656853)好开心啊,但是启动虚拟机的时候悲剧了,提示“在此版本中,…

jQuery 表格插件汇总
本文搜集了大量 jQuery 表格插件,帮助 Web 设计者更好地驾御 HTML 表格,你可以对表格进行横向和竖向排序,设置固定表头,对表格进行搜索,对大表格进行分页,对表格进行滚动,拖放操作等等。这些插件…