无法在Python中保持文本编码
我正在尝试用mechanize这个工具把文件里的文本提交到一个网站的表单上,但文本在那里的显示效果不好。如果我直接复制粘贴,效果是这样的:
████
█⌡⌡⌡⌡████
█⌡⌡⌡⌡⌡⌡⌡⌡⌡█████
█⌡⌡⌡⌡⌡████⌡⌡⌡⌡⌡⌡████
█⌡⌡⌡██ ██⌡⌡⌡⌡⌡⌡⌡⌡█████
█⌡⌡⌡⌡█ █⌡⌡⌡⌡██⌡⌡⌡⌡⌡⌡⌡████
如果我用Python的代码,效果是这样的:
����
���������
���������������
��������������������
������ ���������������
������ ������������������
����� ������ ���������������������
������������� �������� ���������������������������
可能是编码的问题,我搞不定。在原始文件textfile.txt中,编码是OEM-US,我在网上查了一下,这个编码是cp437。
def functionaa(linksite, text):
import mechanize
import cookielib
# Browser
br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
edit = br.open(link)
html1 = edit.read()
br.select_form(nr=0)
br.form['textcode'] = "[pre]%s[/pre]" % text
br.submit()
f=open(r'E:\ABC\textfile.txt', 'r')
content = f.read()
functionaa("http://site.com", content)
2 个回答
0
如果你想把文件的内容上传,就像用户手动在文本框里输入一样,首先要确保处理这些内容的程序能够识别你那些“奇怪”的字符。这意味着你需要确认所用的字符集能够支持这些字符。如果没问题的话,你就可以继续下一步,用下面的方式把文件内容读入一个原生的Python字符串:
file = open(filename, 'rb')
content = unicode(file.read(), 'cp437')
file.close()
# Now use "content" to fill the form
接下来,这就是你应该如何上传文件的方法:
def upload(action, filename):
br = mechanize.Browser()
br.form.add_file(open(filename, 'rb'), 'text/plain; charset=cp437', filename)
# Do your work...
br.submit()
需要注意的是,我是以二进制模式打开文件的,这样文件的字节就不会被改变。此外,我还在MIME类型中指定了预期的编码格式。现在就看服务器的代码如何处理这些编码转换了(如果需要的话)。
1
是的,看起来问题出在 mechanize 这个工具上。在命令行里,我可以像这样打印内容,完全没有 Unicode 的问题。
content = file.read()
print content
但是当我通过 mechanize 发送内容到网站时,结果就不一样了。
如果使用忽略标志的话,所有内容都会被跳过,只留下文本。错误提示说,ASCII 编码无法处理那些字符。