【编码问题】if,for语句与中文编码

1. 首先先来说说中文的问题。众所周知,作死的python2.x(传说中的python2)

经常和中文过不去~

每次,开头必须声明

# coding: utf-8

或者是

# -*- coding: utf-8  -*-

 

然而,被坑过的人都知道。这样是远远不够的,不折腾死你python是不会罢休的

 【python3.x开头就不必声明了, 直接print("你好")就好了】

 

print u"你好"       # 打印成unicode的类型

print u"你好".encode('gbk')   # 打印成unicode的类型,再转码成'gbk'的

print "你好".decode('gbk').encode('gbk')       # 解码成unicode再转码成''gbk类型的

 

在powershell中,上述三种都能显示出中文。而raw_input(">>> ")就只能用后面2种了。

这是为什么呢?让我们来试验一下吧。

s1 = u"你好"

s2 = u"你好".encode('gbk')

s3 = "你好".decode('utf-8').encode('gbk')

 

print type(s1)

输出<type 'unicode'>

print type(s2)

输出<type 'str'>

print type(s3)

输出<type 'str'>

显然,放在raw_input(">>> ")里面的都是被包含" "的str字符串。你用第一种,unicode

类型的来替换str型的,当然会报错啦。

------------------------------------------------------------------------------------------------------

2. 接下来说说if语句和for语句的

txt = "123"

if 1 in txt:

  print "Right"

很显然,这也是类型不对应导致的错误,所以,

data = raw_input(u"取值".encode('gbk'))

if data > "2" / if "2" in data:

这种的,同样要注意,两边都要是字符串

【在python3.x中是data = input("取值"),多快好省】

------------------------------------------------------------------------------------------------------

3.还有一种更变态的错法,就是当不是unicode类型的汉字,用到for语句时,元素个数会发生改变。

s1 = "你好"

s2 = s1.decode('utf-8')

s3 = s2.encode('gbk')

把字符串变成列表的三种方法, 就是下面的a依次变成a, a.split(), list()

def list(a):

  empty = []

  for i in a:

    empty.append(i)

    print len(a) 

list(s1)

list(s2)

list(s3)

最终我们会发现只有unicode类的汉字的列表元素个数始终正确。而在这三种构成列表的方法中,也只有

a.split()时三种汉字的列表元素个数是相等的。所以,为了安全起见,我们以后用for...in...时,还是用u

型的汉字为好。最好都用unicode型的汉字。

那么,问题又来了,万一遇到始终都是str字符串型的raw_input()时该怎么办呢?

import sys

raw_input(">>> ").decode(sys.stdin.encoding)如此一来。里面也就弄不了中文提示了。

 

参考: http://www.tuicool.com/articles/yMrMzmQ

posted @ 2016-07-30 16:33  坏小孩D_R  阅读(264)  评论(0编辑  收藏  举报