Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在将utf-8写入文件,但解析不正确_Python_Utf 8 - Fatal编程技术网

Python 正在将utf-8写入文件,但解析不正确

Python 正在将utf-8写入文件,但解析不正确,python,utf-8,Python,Utf 8,我正在从一个用utf-8编码的网站上阅读文本(存储为纸质['Abstract']),并试图将其写入utf-8编码的文件 但是((撇号)这个字符却变成了–或ÃΩ。如果我手动将文本编码为utf-8,那么它将显示为\xe2\x80\x99或\xc3\xa2\xc2\x80\xc2\x99 无论我尝试使用何种方法将文本写入文件,我都会遇到同样的问题。以下是一个例子: import io from bs4 import BeautifulSoup import re f = io.open('file.

我正在从一个用utf-8编码的网站上阅读文本(存储为纸质['Abstract']),并试图将其写入utf-8编码的文件

但是((撇号)这个字符却变成了–或ÃΩ。如果我手动将文本编码为utf-8,那么它将显示为\xe2\x80\x99或\xc3\xa2\xc2\x80\xc2\x99

无论我尝试使用何种方法将文本写入文件,我都会遇到同样的问题。以下是一个例子:

import io
from bs4 import BeautifulSoup
import re

f = io.open('file.txt', encoding='utf-8', mode='a+')
base = 'https://www.federalreserve.gov'
path = '/econres/notes/feds-notes/index.htm'
response = requests.get(base + path, verify=False)
page = BeautifulSoup(response.text, 'html.parser')
links = page.find_all('a', href=re.compile("/econres/notes/feds-notes/"))
for a in links:
    paper_dict = {}
    paper_dict['Abstract'] = a.find_next('p').find_next('p').text
    print(paper_dict['Abstract'], file=f)


我一直在看的一个特别的例子是题为“SOMA的未实现损失:它意味着什么?”的说明,其中描述了“该说明讨论了美联储证券持有的各种估值措施,这些价值意味着什么,以及SOMA投资组合价值的预期演变。”但在我的输出文件中“Fed's”表示“Fed–s”

我认为您的文件包含正确的UTF-8编码字符串。问题可能是因为您后来阅读它时将其视为拉丁语(iso-8859-1)编码

您应该注意撇号(
)是unicode字符U+0027,或者代码0x27的ASCII字符,但是在HTML页面中,
Fed的
包含一个不同的字符,一个右单引号,即unicode字符U+2019

现在一切都可以解释了:

“Fed's”。encode('utf8')
是以下字节字符串:
b'Fed\xe2\x80\x99s'
。如果尝试将其读取(解码)为拉丁文1,则会得到:

>>> "Fed’s".encode('utf8').decode('latin1')
'Fedâ\x80\x99s'
因为
是unicode字符U+00E2或代码0xe2的iso-8859-1字符。在拉丁字符集中,
'\x80'
'\x99'
都是非打印字符,所以您可以得到:

>>> print("Fed’s".encode('utf8').decode('latin1'))
Fedâs

因此,您的输出文件是正确的,只是您显示它的方式是错误的:您应该使用UTF-8启用文本编辑器,如优秀的vim(gvim)或notepad++(如果您不知道,请用谷歌搜索).

文本的值是多少?我们需要一个。
ecoding='utf-8'
这显然不是您的真实代码,因为
编码
拼写错误。请发布您的真实代码。谢谢,听起来我就快到了!但我尝试用Microsoft Word打开输出文件,选择utf-8作为编码来读取它,但它仍然存在将文本显示为Fed–然后是两个框,然后是s。Microsoft Word不是我所说的启用UTF-8的文本编辑器。即使我使用VIM并使用UTF-8编码读取它(:edit++enc=UTF-8 file.txt),它仍然显示Fed–和两个框…@JZ115:我在考虑
“\xc3\xa2\xc2\x80\xc2\x99”
,这是两次编码…Vim通常允许将文本转换为十六进制(不要在该模式下保存!).你能告诉我正确的引号是如何用hexa编码的吗?是的,当我在VIM中查看hexa时,它看起来就是这样编码的。在这种情况下,有没有解决问题的方法?
>>> print("Fed’s".encode('utf8').decode('latin1'))
Fedâs