关于python字符串的处理

首先讲一下这个

文件头声明编码的作用。

这要感谢这篇博客关于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个元数,一个是检测的可信度,另外一个就是检测到的编码。

参考:编码问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值