您的位置:首页 > 编程语言 > Python开发

关于python字符串的处理

2016-05-16 00:42 567 查看
首先讲一下这个

文件头声明编码的作用。

这要感谢这篇博客关于python文件头部分知识的讲解。

顶部的:# -- coding: utf-8 --目前看来有三个作用。

1.如果代码中有中文注释,就需要此声明

2.比较高级的编辑器(比如我的emacs),会根据头部声明,将此作为代码文件的格式。

3.程序会通过头部声明,解码初始化 u”人生苦短”,这样的unicode对象,(所以头部声明和代码的存储格式要一致)

关于python字符串的处理

做CTF的时候想写一个Python的编码转换器,本来想十分钟搞定的结果写了俩小时,唉,浪费了好多时间

环境python 2.7 + windows + CMD + pycharm 4.5

我在CMD下运行

C:\Users\Administrator>python
Python 2.7 (r27:82525, Jul  4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> print binascii.a2b_hex("e4bda0e5a5bde5958a").decode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'binascii' is not defined
>>> import binascii
>>> print binascii.a2b_hex("e4bda0e5a5bde5958a").decode("utf8")
你好啊
>>> print binascii.a2b_hex("49").decode("utf8")
I
>>> binascii.b2a_hex(u"你好啊".encode("gbk"))
'c4e3bac3b0a1'
>>> binascii.b2a_hex(u'hex_1'.encode("utf8"))
'6865785f31'
>>> binascii.b2a_hex(u"你好啊".encode("utf8"))
'e4bda0e5a5bde5958a'
>>>


然后我在pycharm中运行就总是提示错误

煞笔的我 百度…….(这个梗跳过)才想到

我在CMD下默认是GBK编码,而在pycharm下默认的是utf-8了 所以要先设置

--coding:gbk--

这里查看字符的类型的 用 type()来查看

首先要输入中文

s = raw_input(u”输入要解码成16进制的中文:\n”)

可以查看一下编码类型

print type(s)

str

因为是GBK格式的 所以我们要先解码成Unicode,再转为其他类型的

下面这几段是经典

··············································································

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

代码中字符串的默认编码与代码文件本身的编码一致。

····························································

如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:

isinstance(s, unicode) #用来判断是否为unicode

用非unicode编码形式的str来encode会报错

如何获得系统的默认编码?

!/usr/bin/env python

coding=utf-8

import sys

print sys.getdefaultencoding()

该段程序在英文WindowsXP上输出为:ascii

原理说了半天,最后来个包治百病的吧:)

#!/usr/bin/env python
#coding=utf-8
s="中文"

if isinstance(s, unicode):
#s=u"中文"
print s.encode('gb2312')
else:
#s="中文"
print s.decode('utf-8').encode('gb2312')


如何判断字符str的编码是什么?

使用 chardet 可以很方便的实现字符串/文件的编码检测。尤其是中文网页,有的页面使用GBK/GB2312,有的使用UTF8,如果你需要去爬一些页面,知道网页编码很重要的,虽然HTML页面有charset标签,但是有些时候是不对的。那么chardet就能帮我们大忙了。

>>> import urllib
>>> rawdata = urllib.urlopen('http://www.google.cn/').read()
>>> import chardet
>>> chardet.detect(rawdata)
{'confidence': 0.98999999999999999, 'encoding': 'GB2312'}
>>>


chardet可以直接用detect函数来检测所给字符的编码。函数返回值为字典,有2个元数,一个是检测的可信度,另外一个就是检测到的编码。

参考:编码问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python