无法在Python中保持文本编码

1 投票
2 回答
590 浏览
提问于 2025-04-17 18:35

我正在尝试用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 编码无法处理那些字符。

撰写回答