python \ufeff标识符中的无效字符

ubof19bj  于 2023-02-28  发布在  Python
关注(0)|答案(5)|浏览(115)

下面的代码:

import urllib.request

try:
    url = "https://www.google.com/search?q=test"

    headers = {}
    usag = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0'
    headers['User-Agent'] = usag.encode('utf-8-sig')
    req = urllib.request.Request(url, headers=headers)
    resp = urllib.request.urlopen(req)
    respData = resp.read()

    saveFile = open('withHeaders.txt','w')
    saveFile.write(str(respData))
    saveFile.close()

except Exception as e:
    print(str(e))

它给出了以下错误:

D:\virtualenv\samples\urllibb>python 1.py
  File "1.py", line 35
    usag = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0'\ufeff
                                                                                              ^
 SyntaxError: invalid character in identifier

但是在我的代码中看不到\ufeff

aamkag61

aamkag611#

\ufeff是一个ZERO WIDTH NO-BREAK SPACE codepoint;打印时不呈现。在UTF-16和UTF-32中用作byte order mark,以记录编码字节的解码顺序(big-endian或little-endian)。
UTF-8不需要BOM(它只有一个固定的字节顺序,不需要跟踪替代),但微软认为它是一个方便的 * 签名 * 字符,让他们的工具检测UTF-8文件与8位编码(如大多数Windows codepage使用)。
我怀疑你正在使用一个微软的文本编辑器,比如记事本来保存你的代码。不要这样做,它会包含BOM,但是Python不支持它,或者从UTF-8源文件中删除它。你可能用记事本保存了这个文件,然后继续用一个不同的工具来添加更多的代码,BOM在中间被卡住了。
要么删除整行和下一行,然后重新键入它们,要么从所定义字符串的右引号中选择,直到下一行的headersh之前,删除该部分,然后重新插入一个新行和足够的缩进。
如果你的编辑器支持在搜索和替换时使用转义序列(例如,SublimeText在regex模式下),你可以使用 that 来搜索字符并将其替换为空字符串。在SublimeText中,打开regex支持并搜索\x{feff},将其替换为空字符串。
这里使用的Python utf-8-sig编码也包括BOM:

headers['User-Agent'] = usag.encode('utf-8-sig')

HTTP头也不应该包含这个代码点。HTTP头通常使用拉丁语-1;这里ASCII就足够了,否则使用'utf-8'(不是-sig)。
这里并不需要使用str.encode(),你 * 也 * 可以只定义一个字节串:

headers = {}
usag = b'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0'
headers['User-Agent'] = usag

注意字符串文字的前缀b

ne5o7dgx

ne5o7dgx2#

只需在记事本++中打开脚本文件,转到“编码”选项卡,选择“编码为UTF-8而不使用BOM”并保存文件。

vkc1a9a2

vkc1a9a23#

对于 *nix用户,只需使用以下命令打开文件

[n]vim -b filename

那么

:set list

你会在第一行的开头看到它,因为它的宽度为零,你甚至不能在文本模式下删除它,尝试删除这一行并粘贴文本,在python中剥离它,它仍然在文本中字符0之前。

dpiehjr4

dpiehjr44#

在大多数投票中,他们建议在Sublime Text中使用regex search/replace来替换字符。我不能让它工作,但如果你简单地“保存with Encoding”并选择UTF-8而不是UTF-8 with BOM,它会做你需要的。x1c 0d1x

gjmwrych

gjmwrych5#

字符就在usag = 'Mozilla...行的右引号后面。

相关问题