关键字:python
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 = "中文"
prints
测试一下瞧瞧:
E:/Project/Python/Test>pythonChineseTest.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>pythonChineseTest.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 = "中文"
prints
再试一下:
E:/Project/Python/Test>pythonChineseTest.py
中文
正常咯:)
(二)
看一看它的长度:
# coding=gbk
s = "中文"
printlen(s)
结果:4。
s这里是str类型,所以计算的时候一个中文相当于两个英文字符,因此长度为4。
我们这样写:
# coding=gbk
s = "中文"
s1 = u"中文"
s2 =unicode(s, "gbk") #省略参数将用python默认的ASCII来解码
s3 = s.decode("gbk") #把str转换成unicode是decode,unicode函数作用与之相同
printlen(s1)
printlen(s2)
printlen(s3)
结果:
2
2
2
(三)
接着来看看文件的处理:
建立一个文件test.txt,文件格式用ANSI,内容为:
abc中文
用python来读取
# coding=gbk
printopen("Test.txt").read()
结果:abc中文
把文件格式改成UTF-8:
结果:abc涓枃
显然,这里需要解码:
# coding=gbk
import codecs
printopen("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>
printopen("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:]
printdata.decode("utf-8")
结果:abc中文
(四)一点遗留问题
在第二部分中,我们用unicode函数和decode方法把str转换成unicode。为什么这两个函数的参数用"gbk"呢?
第一反应是我们的编码声明里用了gbk(# coding=gbk),但真是这样?
修改一下源文件:
# coding=utf-8
s = "中文"
printunicode(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 = "中文"
printunicode(s, "gbk")
结果:中文
翻阅了一篇英文资料,它大致讲解了python中的print原理:
WhenPythonexecutes aprintstatement, 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 runningPythonon a Unix box somewhere else, your Windows SSH client is actually responsible for displaying the data. If you are runningPythonin an xterm on Unix, then xterm and your X server handle the display.
Toprintdata reliably, you must know the encoding that this display program expects.
简单地说,python中的print直接把字符串传递给操作系统,所以你需要把str解码成与操作系统一致的格式。Windows使用CP936(几乎与gbk相同),所以这里可以使用gbk。
最后测试:
# coding=utf-8
s = "中文"
printunicode(s, "cp936")
结果:中文
如果以上的还看不明白,再来个对话看看:
[转自http://hi.baidu.com/zjw0358/blog/item/aab19652b51e00080cf3e3ed.html]
str和unicode解析
2008-08-26 16:50
未来(初学者)(41934583) 16:33:58
其次把str转成unicode不是直接构造,是用str对象的decode方法
Django-venjiang-.Net(69583868) 16:34:03
有汉字必须用u'...'这个吗?
未来(初学者)(41934583) 16:34:18
不是
未来(初学者)(41934583) 16:34:38
用u构造出来的是unicode类型,不用的话构造出来是str类型
未来(初学者)(41934583) 16:35:54
str的编码是与系统环境相关的,一般就是sys.getfilesystemencoding()得到的值
Django-venjiang-.Net(69583868) 16:36:12
嗯.明白了.
未来(初学者)(41934583) 16:36:25
unicode你可以不管它是怎么存的,就把它看做是系统能够识别其中内容的文本类型
未来(初学者)(41934583) 16:37:11
所以从unicode转str,被看做是把一个信息文本编码为二进制字节流的过程,要用encode方法
Python2.X(43602410) 16:37:18
有办法判断截取出来的那部分是汉字的前半部分后半部分么?
头太晕django(2538288) 16:37:31
我一个同事,前些天找了一本python的电子书学习.
未来(初学者)(41934583) 16:37:46
从str转unicode,看作是从二进制串出解读出有意义的信息文本,所以要用decode
分享到:
相关推荐
主要介绍了python实现unicode转中文及转换默认编码的方法,结合实例形式分析了Python针对Unicode编码操作的相关技巧及编码转换中的常见问题解决方法,需要的朋友可以参考下
Python 如何将爬取的Unicode码转换为中文信息 Python源码Python 如何将爬取的Unicode码转换为中文信息 Python源码Python 如何将爬取的Unicode码转换为中文信息 Python源码Python 如何将爬取的Unicode码转换为中文...
python判断unicode是否是汉字,数字,英文,或者其他字符.docx
主要介绍了Python3的unicode编码转换成中文的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
问题: 将u’\u810f\u4e71’转换为’\u810f\u4e71′ 方法: s_unicode = u'\u810f\u4e71' ... 您可能感兴趣的文章:python文字和unicode/ascll相互转换函数及简单加密解密实现代码python2 中 uni
今天小编就为大家分享一篇python3 unicode列表转换为中文的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
在unicode码中,汉字的范围是(0x4E00, 9FBF) import random def Unicode(): val = random.randint(0x4e00, 0x9fbf) return chr(val) 这个方法比较简单,但是有个小问题,unicode码中收录了2万多个汉字,包含很多生僻...
国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。兼容GBK和GB2312字符集。
在Python语言中,Uincode字符串处理一直是一个容易让人迷惑的问题。许多Python爱好者经常因为搞不清Unicode、UTF-8还有其它许许多多的编码...本文将介绍Unicode和Python的中文处理的相关知识。下面跟着小编一起来看下吧
在 Python 中有两种默认的字符串:str 和unicode。在Python 中一定要注意区分“Unicode 字符 串”和“unicode 对象”的区别。后面所有的“unicode 字符串”指的都是python 里的“unicode 对象”。 事实上在Python 中...
因为制作了Unicode编码字库存放于ESP32模块中,所以可以显示Unicode编码中文汉字和ASCII码的任意字符。由于ESP32体积有限所以只截取了Unicode编码字库中的中文汉字和ASCII码的字库,字库体积从原来的2048KB裁剪到了...
如果你想动手编写高效、高质量并且很容易与其他语言和工具集成的代码,本书将快速地帮助你利用Python提高效率。本书基于Python专家的流程培训课程...探索先进的Python工具,包括装饰符、描述符、元类、Unicode的处理。
问题一: 将u’\u810f\u4e71’转换为’\u810f\u4e71′ 方法: s_unicode = u’\u810f\u4e71′ s_str = s_unicode.encode(...补充知识:Python最简单的解决列表中只打印UNICODE而不是中文字符的方法 答案就是用js
《Python学习手册:第4版》是《Learning Python》的高清中文扫描版,是易于掌握和自学的教程,根据作者Python专家Mark Lutz的著名培训课程编写而成。 《Python学习手册:第4版》包括以下内容: 学习Python的主要内建...
网络爬虫-如何将爬取的Unicode码转换为中文信息-Python实例源码.zip
Python官方解答unicode编码基本知识以及常见问题的处理。对于深入理解Unicode编码十分重要。
一篇关于STR和UNICODE的好文章 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 用python处理中文时,读取文件或消息,http参数等等 一运行,发现乱码(字符串处理,读写文件,print) ...
Python代码源码-实操案例-框架案例-如何将爬取的Unicode码转换为中文信息.zip