python处理中文莫名转成其他格式的:(

lioujian47 2008-07-08 05:21:49

def body(url1,url2):
try:
txt = urllib.urlopen(url1).read()
except Exception, e:
txt = urllib.urlopen(url2).read()
txt = unicode(txt,"gbk")
parser = html2txt()
parser.feed(txt)
parser.close()
return parser.text

比如以上code中,返回的参数却不是gbk编码了,这个返回的参数传入其他函数的时候又不是gbk编码.
有没有什么办法保证,在处理中文字符的时候一直是gbk编码?
...全文
1178 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lioujian47 2008-07-11
  • 打赏
  • 举报
回复
回复 moxien:
从我的程序看来,没必要转换编码,至少在py2.5.2里面是这样:),所以没必要关心她的charset到底是什么.
我觉得如果要转换编码实际上是方便处理字数.至于这个需不需要转换编码我还没试过.
我的程序在utf-8,gb2312,中测试过,不需要转换编码.就可完成.

所以得出结论,一般处理,甚至re的处理都不需要转换编码,对吗?

还请各位大侠斧正:)
lioujian47 2008-07-11
  • 打赏
  • 举报
回复
回复iambc:
恩,你可以看看我这里的帖子
数据的存储方式类型,是str还是unicode都有注解。
doc.google.com打不开.把url换成g.cn
ar = '网页'

"如果你要匹配中文逗号,句号,那你面想的是字符,而不是字节,那就需要转成unicode。"
这话是说如果要匹配中文逗号,句号就需要转换成unicode吧?
但是我的没有转换成unicode也行哦.
所以干脆我一个编码也没用.
iambic 2008-07-11
  • 打赏
  • 举报
回复
一般来说需要转成unicode。但如果你是把要处理的数据看成字节,那就没有必要转成unicode了。
如果你要匹配中文逗号,句号,那你面想的是字符,而不是字节,那就需要转成unicode。
如果你需要转成unicode,又不知道编码,那就想办法知道编码。比如检查HTTP header信息,检查html源码中的声明,或者猜。
需要注意的是,你得到的html源文件有编码问题,你自己写的python脚本也可能有编码问题。如果你的python代码中出现了中文,那就要小心处理。
在你代码流程的任何地方,你都应该清楚数据的存储方式类型,是str还是unicode。
海楓 2008-07-10
  • 打赏
  • 举报
回复
[Quote:]
1.照你的说法,当我打开一个url之后要先判断他的编码是不是gbk,如果不是才转换成gbk.可是,链接太多的话,编码是很多种的.为什么不管他是不是gbk的,抓到就转换成gbk.

[/Quote]
每一个网页都有自己的字符编码。如下:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
所以每获取一个网页,就先分析它使用的字符集。
将它转为python内部使用的unicode编码,接着再将unicode转为gbk即可。

如果你不知道它原来是什么编码,怎么实现转换呢。你读入的内容python不会自动转为unicode的。如果你硬要将非unicode当成unicode来用也只能出现乱码或出错。

至于“你应该一直在你的程序中使用unicode”的说法只能说比较模糊,对unicode理解还不够。
关于unicode理解可能有点麻烦,自己英文不是很好,没看过完整关于unicode的说明,对unicode的了解也只能来自网络上零碎文字,怕自己理解有误,免得误人子弟,就不多说了。
用我说的方法应可以解决楼主的问题。


Mr_JavaBean 2008-07-09
  • 打赏
  • 举报
回复
返回类型 <type 'unicode'>
试试这样行不行:
return parser.text.encode('GBK')
新手建议..

lioujian47 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 moxien 的回复:]
第一步要知道读入的是什么编码CODE。
如果不是gbk的话,先将其转为unicode。
txtunicode=txt.decode(CODE)
然后再将unicode转为gbk
txtgbk=txtunicode.encode('gbk')
这样就保证txtgbk中的编码为'gbk'了。

最重要的是第一步,要知道返回的CODE是什么。
[/Quote]
1.照你的说法,当我打开一个url之后要先判断他的编码是不是gbk,如果不是才转换成gbk.可是,链接太多的话,编码是很多种的.为什么不管他是不是gbk的,抓到就转换成gbk.

2.要先转unicode再转gbk.
第一个函数的输出要作为下面这个函数的输入.上面函数输出的类型是 unicode,那么照你的说法就应该用encode转换成gbk.但是iambic也说了,你应该一直在你的程序中使用unicode。 那用了encode就不算是一直使用unicode了啊?
到底是怎么回事?

def cn2juhao(txt):
p = re.compile(r'(。|!|……)')
p.sub('。\n',txt)
return txt
海楓 2008-07-08
  • 打赏
  • 举报
回复
第一步要知道读入的是什么编码CODE。
如果不是gbk的话,先将其转为unicode。
txtunicode=txt.decode(CODE)
然后再将unicode转为gbk
txtgbk=txtunicode.encode('gbk')
这样就保证txtgbk中的编码为'gbk'了。

最重要的是第一步,要知道返回的CODE是什么。
lioujian47 2008-07-08
  • 打赏
  • 举报
回复
返回的类型


<type 'unicode'>


iambic 2008-07-08
  • 打赏
  • 举报
回复
先搞清楚body返回的类型是什么。
lioujian47 2008-07-08
  • 打赏
  • 举报
回复

danju= cr2n(unicode(body(url1,url2),"gbk"))
TypeError: decoding Unicode is not supported

unicode不支持gbk啊?....
lioujian47 2008-07-08
  • 打赏
  • 举报
回复
应该怎么做呢?
在开头声明?
能写点code吗?
iambic 2008-07-08
  • 打赏
  • 举报
回复
你应该一直在你的程序中使用unicode。

37,736

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧