1
Livid MOD Python?
Post full code to gist? |
2
likai 2012-05-08 08:24:08 +08:00
源文件的编码是不是UNICODE
|
3
kojp OP |
4
Livid MOD |
5
kojp OP |
6
chainchan 2012-05-08 10:37:30 +08:00
# -*- coding: utf-8 -*-
import sys type = sys.getfilesystemencoding() print content.decode('utf-8').encode(type) |
7
kojp OP |
8
clowwindy 2012-05-08 10:58:13 +08:00 1
Unicode 是一个 21 位的字符空间。它不是一种编码。要输入输出,必须进行解/编码。
UTF-8 是对这个 21 位的字符空间到 8 位的字节形式的一种编码。 在程序内部,可以使用 Unicode。一旦输出,必须编码成字节。如果你自己不做这个转换,print 的时候 Python 会用默认编码给你编码。有时这个默认的编码不是 UTF-8,就会出问题。所以最好自己显式的进行编码。 |
10
chainchan 2012-05-08 11:05:07 +08:00
@kojp 你建立数据库时候是用什么编码?
你可以看看这个或许能解决你的问题,我不太清清楚你具体的工作环境 http://mobile2008.blogbus.com/logs/28531317.html |
11
wynemo 2012-05-08 11:49:59 +08:00
https://github.com/r00te4/tips/blob/master/sendmail/testsendmail.py
看了下 比较混乱 这些repr gbk gb2312是用来干嘛的啊 都用utf-8的str吧 不管那些注释了 你现在这个函数getMailContents 返回的unicode 通过encode('utf-8') 变成str 再用到sendEmail 应该是没问题的 |
12
wynemo 2012-05-08 12:08:10 +08:00
|
13
kojp OP |
14
libei 2012-05-08 12:35:48 +08:00
再复习复习吧。
中文编码漫谈:http://news.congci.com/news/china-encoding-mantan |
15
9hills 2012-05-08 12:37:25 +08:00
Python的中文处理方面这个thread基本都讲完了。。建议看看(需cross wall)
https://groups.google.com/d/topic/cn.bbs.comp.lang.python/8KO7YrgUVXM/discussion 说回你的程序:你的程序的关键部分是: htmltext=u"\u8c37\u6b4c\u4e91\u5b58\u50a8" 然后再sendEmail(htmltext). 你要知道 a="中文" 和 b=u'\u4e2d\u6587' 是不一样的,其中b=a.decode("utf-8") 显然sendmail不能接受unicode的字符串做参数,必须是utf-8的。。。 |
16
kojp OP @9hills
htmltext=u"\u8c37\u6b4c\u4e91\u5b58\u50a8" 这样是对的。 isinstance(htmltest,unicode) 的结果为true print 出来,不乱码。 但我从数据库里读出来的 isinstance(htmltest,unicode) 的结果为false 我想问题就在这~~~ 但是还是没办法解决 :-| |
17
kojp OP |
18
wynemo 2012-05-08 13:07:05 +08:00 1
@kojp 大概就是这句吧 repr(mailInfo[3]).encode("utf-8")
正确的做法是rmailInfo[3].encode("utf-8") >>> print repr(u'中文毫无压力abcはじめまして').encode("utf-8").decode('utf-8') u'\u4e2d\u6587\u6beb\u65e0\u538b\u529babc\u306f\u3058\u3081\u307e\u3057\u3066' >>> print u'中文毫无压力abcはじめまして'.encode("utf-8").decode('utf-8') 中文毫无压力abcはじめまして 用repr当然还原不了了。。。。 |
19
kojp OP @wynemo 你是对的! 现在能看到中文了。我看一下到邮箱里面是否乱码~~~谢谢!!!!(其实repr那个,我也就是百种百度GOOGLE各种尝试的~~没有真实依据)
|
20
kojp OP 恭喜一下自己,有“进步”了。
终于脱离了滥谷的 u'\u4e2d\u6587\u6beb\u65e0\u538b\u529babc\u306f\u3058\u3081\ 已经进化到 '\xe5\x91\xa8\xe6\x9c\xab\xe8\xa6\x81\xe9\x97\xbb\xe5\x9b\x9e\xe9\xa1\xbe 了。哈哈。 |
21
magicshui 2012-05-08 13:36:08 +08:00
我真被编码问题折腾吐过~
|
22
9hills 2012-05-08 13:41:08 +08:00
@kojp
htmltext=u"\u8c37\u6b4c\u4e91\u5b58\u50a8" 这个当然是unicode。。u开头的都是unicode,但是它不是utf-8啊 unicode是直接可以print的,utf-8也是直接可以在UTF-8的终端中print的。。。但是不能混 你这句 msgText.set_charset("utf-8") msgText = MIMEText(htmlText, 'html', 'utf-8') 明明htmlText是unicode,但是你又把它指定为utf-8。。岂不是会混乱 |
23
kojp OP @wynemo
伸手党来了,貌似只能靠你拯救了。哥们~~ 按你的说法,我已经可以成功print 出中文了。 但是,当我把这串unicode传到sendmail里面去,提示要字符串。(返回的是list0 我乖乖地str(htmltext)然后,再print 就成'\xe5\x91\xa8\xe6\'这个样子了。不用str用unicode更糟糕,字节都给分散了~~ |
24
9hills 2012-05-08 13:46:30 +08:00
@kojp replay to #20
你这一大串是utf-8。。。 打开python,试试下面这个(Linux UTF-8 locale) >>> a="中文" #a是utf-8的字符串 >>> a '\xe4\xb8\xad\xe6\x96\x87' >>>print a #打印a 中文 >>> au=a.decode("utf8") #把a变成unicode >>> au u'\u4e2d\u6587' >>> print au 中文 >>> au.encode("utf8") #又把unicode的au变成utf8 '\xe4\xb8\xad\xe6\x96\x87' |
25
9hills 2012-05-08 13:47:41 +08:00
@kojp #23 本来就是字符串,不要用str,repr来转编码。。。
用 htmltext.encode("utf8") 转 |
26
kojp OP 结贴!
谢谢各位! |
27
kojp OP 不光吐血,感触N多。。。很多都是因为基础知识不够扎实-------回去恶补!
这两天要写一篇总结同来。 再次谢谢各位v2exer! (抱拳!) |
28
kojp OP """我乖乖地str(htmltext)然后,再print 就成'\xe5\x91\xa8\xe6\'这个样子了。不用str用unicode更糟糕,字节都给分散了~~"""
关于这个问题,我是这样解决的,(估计可能有其它的函数或者方法,但我没找见怪不怪 我直接循环了一下返回的unicode列表。然后字符串拼接一下。然后传给sendmail. 这个办法貌似土到家了,但暂时也只能这样。记得上次有个问题也是这样解决的。总的来说,还是对list和str的内部结构了解不够透彻。 |
29
binux 2012-05-08 14:07:28 +08:00
完全不明白说的是什么。。
|
30
reus 2012-05-08 14:11:09 +08:00
一个unicode列表转换成str这样就行了啊
''.join(s.encode('utf8') for s in l) 说到底就是你不知道encode, decode这两个方法,编码转换根本不需要用到str和unicode两个函数的 |
31
reus 2012-05-08 14:21:37 +08:00
你的程序最下面那个htmlText的类型是unicode,也就是unicode字符串,如果要转换成str类型的字符串,直接htmlText.encode('utf8')就可以了
|
32
benzhe 2012-05-08 14:41:43 +08:00
貌似 python 的编码问题的确会难处理一些,当初只是弄一个文件上传,文件名的编码也是折腾了很久。php javascript 怎么弄都没这么麻烦...
|
34
reus 2012-05-08 15:08:13 +08:00
php也一样要用到iconv处理编码,py不比其他语言更难处理,是使用者对unicode不理解而已
|
35
clowwindy 2012-05-08 19:57:16 +08:00
理解什么是 Unicode,什么是编码,比理解怎么在语言里用这些东西更重要一些。
|
36
kojp OP |