python文件中文和 print 的中文的总结如下:
1 # coding=utf-8 或者 # coding=gbk 表明这个文件使用何种编码
如果出现非acs II 码,则必须制定编码
否则
s = "中文"
或
s = u"中文" 都会报错
2 print是python把 字符串丢给操作系统,再丢出之前,要求字符的编码与 文件指定的编码一致(而不必与操作系统默认编码一致, 貌似print 会根据 文件编码--》操作系统编码做自动转化)
假设 操作系统编码为gbk
# coding=gbk
s = "中文"
print s
和
# coding=utf-8
s = "中文"
print s
都没有问题
# coding=gbk
s = u"中文"
print s // 报错,因为此时 s 是unicode 编码, 而文件指定的却是gbk
print s.encode("gbk") //OK
print s.encode("utf-8") // 不报错,乱码
utf-8 与unicode是不同的
# coding=utf-8
s = u"中文"
print s // 报错,因为此时 s 是unicode 编码, 而文件指定 utf-8 同样报错
print s.encode("utf-8") //OK
print s.encode("gbk") // 报错, 其原因是print引起的, 不是encode!是因为此时的utf8的编码gbk 也能识别。 尽管操作系统是 gbk,但是最终编码错误的,无法print
3 python 中的 str 和 "%s"%var
在文件中,str,和%s 作用基本相同
str(unicode_var) 和 "%s"%unicode_var ,如果unicode_var 中包含非ascII 的字符时,都将报错。
特例:在交互平台是, 可以 "%s"%unicode_var ,其中unicode_var 包含非asc2字符,如
>>> ss = u'中文'
>>> "%s"%ss
u'\u4e2d\u6587'
str(ss)则报错
>>> str(ss)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
×××特例××××
在交互控制台时,可以直接print unicode
>>> ss = u"中文"
>>> print ss
中文
但是不能被序列化
>>> str(ss)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
str相当于文件中的print (非控制台)
str不能直接针对unicode,必须是已经编码了的 “字节码序列”
3 关于字符长度
# coding=gbk 或者
s = "中文"
su = u"中文"
print len(s) // 4
print len(s.decode('gbk')) // 2
print len(aa.decode('gbk').encode("utf-8")) //6,utf-8使用3字节表示一中文
pirnt len(su) //2
print s
//len在针对 被编码了的字符(其实字节数组),得到的字节个数,
// 针对unicode时候,可以想象是 数出了 unicode对象的个数(一个中文[|英文]一个unicode对象)
[color=red]ps:最容易造成困惑的一种情况,
"%s %s "%(codec1, codec2), 其中codec1,和codec2 编码不一致, unicode,与gbk,utf-8之类的编码混杂的情况。[/color]
更详细的参考文章:http://blog.youkuaiyun.com/mayflowers/archive/2007/04/18/1568852.aspx
1 # coding=utf-8 或者 # coding=gbk 表明这个文件使用何种编码
如果出现非acs II 码,则必须制定编码
否则
s = "中文"
或
s = u"中文" 都会报错
2 print是python把 字符串丢给操作系统,再丢出之前,要求字符的编码与 文件指定的编码一致(而不必与操作系统默认编码一致, 貌似print 会根据 文件编码--》操作系统编码做自动转化)
假设 操作系统编码为gbk
# coding=gbk
s = "中文"
print s
和
# coding=utf-8
s = "中文"
print s
都没有问题
# coding=gbk
s = u"中文"
print s // 报错,因为此时 s 是unicode 编码, 而文件指定的却是gbk
print s.encode("gbk") //OK
print s.encode("utf-8") // 不报错,乱码
utf-8 与unicode是不同的
# coding=utf-8
s = u"中文"
print s // 报错,因为此时 s 是unicode 编码, 而文件指定 utf-8 同样报错
print s.encode("utf-8") //OK
print s.encode("gbk") // 报错, 其原因是print引起的, 不是encode!是因为此时的utf8的编码gbk 也能识别。 尽管操作系统是 gbk,但是最终编码错误的,无法print
3 python 中的 str 和 "%s"%var
在文件中,str,和%s 作用基本相同
str(unicode_var) 和 "%s"%unicode_var ,如果unicode_var 中包含非ascII 的字符时,都将报错。
特例:在交互平台是, 可以 "%s"%unicode_var ,其中unicode_var 包含非asc2字符,如
>>> ss = u'中文'
>>> "%s"%ss
u'\u4e2d\u6587'
str(ss)则报错
>>> str(ss)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
×××特例××××
在交互控制台时,可以直接print unicode
>>> ss = u"中文"
>>> print ss
中文
但是不能被序列化
>>> str(ss)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
str相当于文件中的print (非控制台)
str不能直接针对unicode,必须是已经编码了的 “字节码序列”
3 关于字符长度
# coding=gbk 或者
s = "中文"
su = u"中文"
print len(s) // 4
print len(s.decode('gbk')) // 2
print len(aa.decode('gbk').encode("utf-8")) //6,utf-8使用3字节表示一中文
pirnt len(su) //2
print s
//len在针对 被编码了的字符(其实字节数组),得到的字节个数,
// 针对unicode时候,可以想象是 数出了 unicode对象的个数(一个中文[|英文]一个unicode对象)
[color=red]ps:最容易造成困惑的一种情况,
"%s %s "%(codec1, codec2), 其中codec1,和codec2 编码不一致, unicode,与gbk,utf-8之类的编码混杂的情况。[/color]
更详细的参考文章:http://blog.youkuaiyun.com/mayflowers/archive/2007/04/18/1568852.aspx