[学习笔记]Python_编码(20171118)

常见编码
ASCII(英文,单字节,65A,91Z,256个字符)
GB2312(简体中文)
GBK(GB2312扩展,简繁体中文,含日文假名)
BIG5(台湾香港繁体字)
ANSI(文本保存ANSI表示GBK)
Unicode(全球所有字符编码)
UTF-8(可变长编码,保存1-3个字节,完全兼容acsii码的256个字符)
cp936:中文Windows中的cmd默认codepage是系统里第936号编码格式,即GB2312的编码

#encoding=utf-8

s=raw_input("请输入一句话".decode("utf-8").encode("gbk"))
print s

中文使用

1.保存utf-8格式
2.头申明 #encoding=utf-8
3.前加u u”中国”
*字符串有两种类型:字符型字符串,Unicode型字符串;内存存储时都是Unicode型字符串(服务器存储unicode), 应用程序输出utf-8再显示到浏览器
中文前加u和不加u是不一样的格式
在python中打印与不打印调用不同方法: “repr“;” str“; 显示中文需要打印出来

这里写图片描述

编码及转换
其他字符编码及转换成unicode,使用decode
Unicode转换其他字符编码级,使用encode

chardet
检测字符的编码级
pip install chardet进行安装
import chardet引入

#encoding=utf-8
import chardet
print type("中国".decode("utf-8"))
print "中国".decode("utf-8").encode("gbk")
print type("中国".decode("utf-8").encode("gbk"))
print chardet.detect("中国人民富裕了,开始走向伟大复兴".decode("utf-8").encode("gbk"))

#encoding=utf-8
import chardet
import sys
print sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding("utf-8") #使用这个方法需要reload(sys)
print "中国".encode("gbk")   #编码转换的时候,会自动调用默认字符集去decode方法
#去decode 转换为unicode字符。


>>>"s".decode("gbk")
u's'
>>>"s".decode("gbk").encode("utf-8")
's'
>>> u"s".decode("gbk")
u's'
>>>u"中国".decode("gbk")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode by
ibyte sequence

#字符串相互转换示范
>>>"a".decode("gbk")
u'a'
>>>"a".decode("gbk").encode("gbk")
'a'
>>>type("a".decode("gbk").encode("gbk"))
<type 'str'>

文件存写过程中编码转换实例:
先创建一个txt文件含中文,存成ANSI格式,然后执行以下代码

#-*- coding: UTF-8 -*-
fp1 = open('d:\\testfile.txt', 'r') #手工创建文件为ANSI编码保存(gbk)
info1 = fp1.read()
# 已知是 GBK 编码,解码成 Unicode、文件内容要有中文
tmp = info1.decode('GBK')

fp2 = open('d:\\testfile.txt', 'w')   
# 编码成 UTF-8 编码的 str
info2 = tmp.encode('UTF-8') 
fp2.write(info2)  #写入utf8字符,并进行保存
fp2.close()       #文件会变为utf-8编码保存   

如何判断是否是字符串
if isinstance(s,str):pass #无法判断unicdoe字符串情况
if isinstance(s,basestring):#True for both Unicode and byte strings pass

#判断类型实例
#-*- coding: UTF-8 -*-
s = "hello normal string"
u=u"unicode"
if isinstance( s, basestring ):
    print u"是字符串"
if isinstance( u, basestring ):
    T   isinstance("s",str)
True

#练习
isinstance(u"s",str)
False
isinstance(u"s",unicode)
True
isinstance(u"s",basestring)
True
isinstance("s",
True    

实例:

import chardet  
import urllib  

#根据需要选择不同的数据类型
TestData = urllib.urlopen('http://www.baidu.com/').read()  
print chardet.detect(TestData)

常量
1.保存文件const.py和test.py在同一目录
2.运行test.py会提示错误
const.py

#-*-coding:UTF-8-*-
#Filename: const.py 
# 定义一个常量类实现常量的功能 
# # 该类定义了一个方法__setattr()__,和一个异常ConstError, ConstError类继承 
# 自类TypeError. 通过调用类自带的字典__dict__, 判断定义的常量是否包含在字典 
# 如果字典中包含此变量,将抛出异常,否则,给新创建的常量赋值。 
# 最后两行代码的作用是把const类注册到sys.modules这个全局字典中。 
class _const: 
    class ConstError(TypeError):pass 
    def __setattr__(self, name, value): 
        if self.__dict__.has_key(name): 
            raise self.ConstError, "Can't rebind const (%s)" %name 
        self.__dict__[name]=value 
import sys 

test.py

import const
const.magic = 23 
print const.magic
c
const.magic = 33

练习
练习一:生成所有小写字母,大写字母,大小写混合字母

>>> lower_cases =""
>>> for i in range(97,97+26):
...     lower_cases+=chr(i)
...
>>> print lower_cases
abcdefghijklmnopqrstuvwxyz

upper_cases=""
>>> for i in range(65,65+26):
...     upper_cases+=chr(i)
...
>>> print upper_cases
ABCDEFGHIJKLMNOPQRSTUVWXYZ

>>> letters=""
>>> for s in range(65,65+26):
...     letters+=chr(s)+chr(s+32)
...
>>> print letters
AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
>>>

练习二:判断一个句子中包含多少字母

#方法1
>>> letters=""
>>> for s in range(65,65+26):
...     letters+=chr(s)+chr(s+32)
...
>>> print letters
>>> content=raw_input("please input a sentence:")
please input a sentence:I am a boy!
>>> letter_count=0
>>> for s in content:
...     if s in letters:
...         letter_count+=1
...
>>> print letter_count

#方法2
>>> import string
>>> letter_count=0
>>> a=raw_input("请输入:")
请输入:ad123 9e
>>> for i in a:
...    if i in string.letter:
...         letter_count+=1
...
>>>print letter_count 

练习三:加密与解密

letters = raw_input("please input some letter to encode:")
encoded_letters=""
for s in letters:
    if (s >= 'a' and s <"w") or  (s >= 'A' and s <"W"):
        encoded_letters+=chr(ord(s)+4)
    elif s>="w" and s<="z":
        encoded_letters+=chr(ord(s)-ord("w")+97)
    elif s>="W" and s<="Z":
        encoded_letters+=chr(ord(s)-ord("W")+65)
    else:
        print "some content is not letter!please try again!"
        continue

print encoded_letters

参考
ASCII表 http://tool.oschina.net/commons?type=4
Python编码问题整理https://www.cnblogs.com/fnng/p/5008884.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值