如何在Python3中将字符串从cp1251转换为UTF-8?

时间:2018-08-17 12:22:24

标签: python python-3.x utf-8 cp1251

一个非常简单的Python 3.6脚本需要的帮助。

首先,它从使用cp1251编码的老式服务器中下载HTML文件。

然后,我需要将文件内容放入UTF-8编码的字符串中。

这是我在做什么:

import requests
import codecs

#getting the file
ri = requests.get('http://old.moluch.ru/_python_test/0.html')

#checking that it's in cp1251
print(ri.encoding)

#encoding using cp1251
text = ri.text
text = codecs.encode(text,'cp1251')

#decoding using utf-8 - ERROR HERE!
text = codecs.decode(text,'utf-8')

print(text)

这是错误:

Traceback (most recent call last):
  File "main.py", line 15, in <module>
    text = codecs.decode(text,'utf-8')
  File "/var/lang/lib/python3.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 43: invalid continuation byte

非常感谢您提供任何帮助。

4 个答案:

答案 0 :(得分:2)

不确定您要做什么。

.text是响应的文本,一个Python字符串。编码在Python字符串中不起作用。

仅当您有想要将字节流转换为(或相反)的字节流时,编码才起作用。请求模块已经为您做到了。

import requests

ri = requests.get('http://old.moluch.ru/_python_test/0.html')
print(ri.text)

例如,假设您有一个文本文件(即:字节)。然后,在open()文件时必须选择一种编码-编码的选择决定了文件中的字节如何转换为字符。此手动步骤是必需的,因为open()无法知道文件字节的编码方式。

另一方面,

HTTP在响应头(Content-Type)中发送此消息,因此requests 可以知道此信息。作为高级模块,它有助于查看HTTP标头并为您转换传入的字节。 (如果要使用更底层的urllib,则必须自己进行解码。)

当您使用响应的.encoding时,.text属性是纯信息性的。但是,如果您使用.raw属性,则可能是相关的。对于与返回常规文本响应的服务器一起使用,几乎不需要使用.raw

答案 1 :(得分:1)

您不需要进行编码/解码。

  

“发出请求时,请求会根据HTTP标头对响应的编码进行有根据的猜测。访问r.text时将使用请求所猜测的文本编码。”

这将起作用:

import requests

#getting the file
ri = requests.get('http://old.moluch.ru/_python_test/0.html')

text = ri.text

print(text)

对于非文本请求,您还可以以字节形式访问响应正文:

ri.content

请签出requests documentation

答案 2 :(得分:1)

当许多人已经回答您进行 requests.get 时,您将收到解码后的消息。我将回答您现在面临的错误。

此行:

text = codecs.encode(text,'cp1251')

将文本编码为cp1251,然后尝试使用utf-8对其进行解码,这会在此处出现错误:

text = codecs.decode(text,'utf-8')

要检测类型,可以使用:

import chardet
text = codecs.encode(text,'cp1251')
chardet.detect(text) . #output {'encoding': 'windows-1251', 'confidence': 0.99, 'language': 'Russian'}

#OR
text = codecs.encode(text,'utf-8')
chardet.detect(text) . #output {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

因此以一种格式编码然后以另一种格式解码会导致错误。

答案 3 :(得分:-1)

您只需在解码功能中添加设置即可忽略该错误:

text = codecs.decode(text,'utf-8',errors='ignore')