被编码折腾得想吐了,早上六点一直折腾到现在。真想暴粗口~~~。

2012-05-08 08:13:53 +08:00
 kojp
真心求助!

一直都小心翼翼地用unicode。现在写到数据库里的是unicode

取出来以后还是unicode

u'\u8c37\u6b4c\u4e91\u5b58\u50a8'

直接在终端里面输出,
print u'\u8c37\u6b4c\u4e91\u5b58\u50a8'

谷歌云存储

可以正常显示中文。

在程序里面输出,就是 u'\u8c37\u6b4c\u4e91\u5b58\u50a8'~~~~

啊!!!尼妹的!编码~~~~
6481 次点击
所在节点    Python
37 条回复
Livid
2012-05-08 08:22:41 +08:00
Python?

Post full code to gist?
likai
2012-05-08 08:24:08 +08:00
源文件的编码是不是UNICODE
kojp
2012-05-08 08:41:53 +08:00
@likai
为了杜绝这个情况 , 已经直接在 linux平台编码了 . . .也不排除这种极端的可能性 .----- print sys.stdin已经是 utf8了
@Livid

Thanks, 现在在路上 ,到办公室了再上上传 .
Livid
2012-05-08 08:48:37 +08:00
@kojp 期待。

我每次遇到这类编码问题都很有兴趣解决。

移动到 /go/python 了。
kojp
2012-05-08 10:29:57 +08:00
chainchan
2012-05-08 10:37:30 +08:00
# -*- coding: utf-8 -*-
import sys
type = sys.getfilesystemencoding()
print content.decode('utf-8').encode(type)
kojp
2012-05-08 10:39:08 +08:00
@chainchan 呃,跟数据库取出来的东西有关吧。

各种decode,encode,codec,chardet都试过了~~ :-(
clowwindy
2012-05-08 10:58:13 +08:00
Unicode 是一个 21 位的字符空间。它不是一种编码。要输入输出,必须进行解/编码。

UTF-8 是对这个 21 位的字符空间到 8 位的字节形式的一种编码。

在程序内部,可以使用 Unicode。一旦输出,必须编码成字节。如果你自己不做这个转换,print 的时候 Python 会用默认编码给你编码。有时这个默认的编码不是 UTF-8,就会出问题。所以最好自己显式的进行编码。
binux
2012-05-08 11:01:04 +08:00
@kojp 没有看到“在程序里面输出,就是 u'\u8c37\u6b4c\u4e91\u5b58\u50a8'” 的现象啊?
chainchan
2012-05-08 11:05:07 +08:00
@kojp 你建立数据库时候是用什么编码?

你可以看看这个或许能解决你的问题,我不太清清楚你具体的工作环境
http://mobile2008.blogbus.com/logs/28531317.html
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 应该是没问题的
wynemo
2012-05-08 12:08:10 +08:00
测试了一下 正常

http://gist.github.com/2632474
kojp
2012-05-08 12:32:53 +08:00
@wynemo 问题是,我取出来的时候,他就直接是STR了。

我再给他转成unicode, 再encode成utf-8

就不行了~~
libei
2012-05-08 12:35:48 +08:00
再复习复习吧。
中文编码漫谈:http://news.congci.com/news/china-encoding-mantan
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的。。。
kojp
2012-05-08 12:52:32 +08:00
@9hills

htmltext=u"\u8c37\u6b4c\u4e91\u5b58\u50a8" 这样是对的。
isinstance(htmltest,unicode) 的结果为true
print 出来,不乱码。

但我从数据库里读出来的 isinstance(htmltest,unicode) 的结果为false
我想问题就在这~~~

但是还是没办法解决 :-|
kojp
2012-05-08 12:56:27 +08:00
@chainchan @9hills @chainchan

你们给的链接,我一个一个看吧。(虽然大多数,以前都看过, 上次也是解决一个编码的问题,但跟数据库无关)

谢谢。

有人能帮我仔细看一下我从数据库里查询信息这块的编码会不会有误?(数据库是utf-8 编码)

PS: 我有点怀疑,我肯定是掉进一个不知名的坑爹“坑”里了,比如说逻辑错误,或者其它非编码错误。
wynemo
2012-05-08 13:07:05 +08:00
@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当然还原不了了。。。。
kojp
2012-05-08 13:12:06 +08:00
@wynemo 你是对的! 现在能看到中文了。我看一下到邮箱里面是否乱码~~~谢谢!!!!(其实repr那个,我也就是百种百度GOOGLE各种尝试的~~没有真实依据)
kojp
2012-05-08 13:31:49 +08:00
恭喜一下自己,有“进步”了。
终于脱离了滥谷的 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
了。哈哈。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/35062

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX