Python 字符串中的 u'\ufeff'

2025-01-03 08:41:00
admin
原创
88
摘要:问题描述:我收到一个错误,异常消息如下:UnicodeEncodeError: 'ascii' codec can't encode character u'/ufeff' in position 155: ordinal not in range(128) 不知道u'/ufeff'是什么,它在我进行网页抓取...

问题描述:

我收到一个错误,异常消息如下:

UnicodeEncodeError: 'ascii' codec can't encode character u'/ufeff' in
position 155: ordinal not in range(128)

不知道u'/ufeff'是什么,它在我进行网页抓取时出现。我该如何补救?.replace()字符串方法对它不起作用。


解决方案 1:

我在 Python 3 上遇到了这个问题,并找到了这个问题(和解决方案)。打开文件时,Python 3 支持 encoding 关键字来自动处理编码。

如果没有它,读取结果中会包含 BOM:

>>> f = open('file', mode='r')
>>> f.read()
'/ufefftest'

如果给出正确的编码,结果中将省略 BOM:

>>> f = open('file', mode='r', encoding='utf-8-sig')
>>> f.read()
'test'

仅我的观点。

解决方案 2:

Unicode 字符U+FEFF是字节顺序标记 (BOM),用于区分大端和小端 UTF-16 编码。如果您使用正确的编解码器解码网页,Python 会为您删除它。示例:

#!python2
#coding: utf8
u = u'ABC'
e8 = u.encode('utf-8')        # encode without BOM
e8s = u.encode('utf-8-sig')   # encode with BOM
e16 = u.encode('utf-16')      # encode with BOM
e16le = u.encode('utf-16le')  # encode without BOM
e16be = u.encode('utf-16be')  # encode without BOM
print 'utf-8     %r' % e8
print 'utf-8-sig %r' % e8s
print 'utf-16    %r' % e16
print 'utf-16le  %r' % e16le
print 'utf-16be  %r' % e16be
print
print 'utf-8  w/ BOM decoded with utf-8     %r' % e8s.decode('utf-8')
print 'utf-8  w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig')
print 'utf-16 w/ BOM decoded with utf-16    %r' % e16.decode('utf-16')
print 'utf-16 w/ BOM decoded with utf-16le  %r' % e16.decode('utf-16le')

请注意,这EF BB BF是 UTF-8 编码的 BOM。它不是 UTF-8 所必需的,但仅用作签名(通常在 Windows 上)。

输出:

utf-8     'ABC'
utf-8-sig 'xefxbbxbfABC'
utf-16    'xffxfeAx00Bx00Cx00'    # Adds BOM and encodes using native processor endian-ness.
utf-16le  'Ax00Bx00Cx00'
utf-16be  'x00Ax00Bx00C'

utf-8  w/ BOM decoded with utf-8     u'/ufeffABC'    # doesn't remove BOM if present.
utf-8  w/ BOM decoded with utf-8-sig u'ABC'          # removes BOM if present.
utf-16 w/ BOM decoded with utf-16    u'ABC'          # *requires* BOM to be present.
utf-16 w/ BOM decoded with utf-16le  u'/ufeffABC'    # doesn't remove BOM if present.

请注意,utf-16编解码器需要存在 BOM,否则 Python 将不知道数据是大端还是小端。

解决方案 3:

该字符是BOM或“字节顺序标记”。它通常作为文件的前几个字节接收,告诉您如何解释其余数据的编码。您可以简单地删除该字符以继续。尽管错误表明您试图转换为“ascii”,但您可能应该为您尝试执行的任何操作选择另一种编码。

解决方案 4:

您正在抓取的内容是用 unicode 而不是 ascii 文本编码的,并且您得到的字符不会转换为 ascii。正确的“翻译”取决于原始网页认为它是什么。Python 的 unicode 页面提供了其工作原理的背景。

您是想打印结果还是将其粘贴到文件中?错误表明是写入数据导致了问题,而不是读取数据。这个问题是寻找修复方法的好地方。

解决方案 5:

您可以在迭代所有字符时替换它,如下所示:

''.join(char.replace('/ufeff', '') for char in html_string)

来源:https://www.reddit.com/r/learnpython/comments/rlfos7/comment/hpfezxz/? utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button

解决方案 6:

这是基于 Mark Tolonen 的回答。字符串包含单词“test”的不同语言,以“|”分隔,因此您可以看到差异。

u = u'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
e8 = u.encode('utf-8')        # encode without BOM
e8s = u.encode('utf-8-sig')   # encode with BOM
e16 = u.encode('utf-16')      # encode with BOM
e16le = u.encode('utf-16le')  # encode without BOM
e16be = u.encode('utf-16be')  # encode without BOM
print('utf-8     %r' % e8)
print('utf-8-sig %r' % e8s)
print('utf-16    %r' % e16)
print('utf-16le  %r' % e16le)
print('utf-16be  %r' % e16be)
print()
print('utf-8  w/ BOM decoded with utf-8     %r' % e8s.decode('utf-8'))
print('utf-8  w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig'))
print('utf-16 w/ BOM decoded with utf-16    %r' % e16.decode('utf-16'))
print('utf-16 w/ BOM decoded with utf-16le  %r' % e16.decode('utf-16le'))

以下是一次测试运行:

>>> u = u'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> e8 = u.encode('utf-8')        # encode without BOM
>>> e8s = u.encode('utf-8-sig')   # encode with BOM
>>> e16 = u.encode('utf-16')      # encode with BOM
>>> e16le = u.encode('utf-16le')  # encode without BOM
>>> e16be = u.encode('utf-16be')  # encode without BOM
>>> print('utf-8     %r' % e8)
utf-8     b'ABCtestxcexb2xe8xb2x9dxe5xa1x94xecx9cx84mxc3xa1sbxc3xaata|test|xd8xa7xd8xaexd8xaaxd8xa8xd8xa7xd8xb1|xe6xb5x8bxe8xafx95|xe6xb8xacxe8xa9xa6|xe3x83x86xe3x82xb9xe3x83x88|xe0xa4xaaxe0xa4xb0xe0xa5x80xe0xa4x95xe0xa5x8dxe0xa4xb7xe0xa4xbe|xe0xb4xaaxe0xb4xb0xe0xb4xbfxe0xb4xb6xe0xb5x8bxe0xb4xa7xe0xb4xa8|xd7xa4xd6xbcxd7xa8xd7x95xd7x91xd7x99xd7xa8xd7x9f|kixe1xbbx83m tra|xc3x96lxc3xa7ek|'
>>> print('utf-8-sig %r' % e8s)
utf-8-sig b'xefxbbxbfABCtestxcexb2xe8xb2x9dxe5xa1x94xecx9cx84mxc3xa1sbxc3xaata|test|xd8xa7xd8xaexd8xaaxd8xa8xd8xa7xd8xb1|xe6xb5x8bxe8xafx95|xe6xb8xacxe8xa9xa6|xe3x83x86xe3x82xb9xe3x83x88|xe0xa4xaaxe0xa4xb0xe0xa5x80xe0xa4x95xe0xa5x8dxe0xa4xb7xe0xa4xbe|xe0xb4xaaxe0xb4xb0xe0xb4xbfxe0xb4xb6xe0xb5x8bxe0xb4xa7xe0xb4xa8|xd7xa4xd6xbcxd7xa8xd7x95xd7x91xd7x99xd7xa8xd7x9f|kixe1xbbx83m tra|xc3x96lxc3xa7ek|'
>>> print('utf-16    %r' % e16)
utf-16    b"xffxfeAx00Bx00Cx00tx00ex00sx00tx00xb2x03x9dx8cTXx04xc7mx00xe1x00sx00bx00xeax00tx00ax00|x00tx00ex00sx00tx00|x00'x06.x06*x06(x06'x061x06|x00Kmxd5x8b|x00,nfx8a|x00xc60xb90xc80|x00*    0    @    x15    M    7    >    |x00*
0
?
6
K
'
(
|x00xe4x05xbcx05xe8x05xd5x05xd1x05xd9x05xe8x05xdfx05|x00kx00ix00xc3x1emx00 x00tx00rx00ax00|x00xd6x00lx00xe7x00ex00kx00|x00"
>>> print('utf-16le  %r' % e16le)
utf-16le  b"Ax00Bx00Cx00tx00ex00sx00tx00xb2x03x9dx8cTXx04xc7mx00xe1x00sx00bx00xeax00tx00ax00|x00tx00ex00sx00tx00|x00'x06.x06*x06(x06'x061x06|x00Kmxd5x8b|x00,nfx8a|x00xc60xb90xc80|x00*    0    @    x15    M    7    >    |x00*
0
?
6
K
'
(
|x00xe4x05xbcx05xe8x05xd5x05xd1x05xd9x05xe8x05xdfx05|x00kx00ix00xc3x1emx00 x00tx00rx00ax00|x00xd6x00lx00xe7x00ex00kx00|x00"
>>> print('utf-16be  %r' % e16be)
utf-16be  b"x00Ax00Bx00Cx00tx00ex00sx00tx03xb2x8cx9dXTxc7x04x00mx00xe1x00sx00bx00xeax00tx00ax00|x00tx00ex00sx00tx00|x06'x06.x06*x06(x06'x061x00|mKx8bxd5x00|n,x8afx00|0xc60xb90xc8x00|    *    0    @    x15    M    7    >x00|
*
0
?
6
K
'
(x00|x05xe4x05xbcx05xe8x05xd5x05xd1x05xd9x05xe8x05xdfx00|x00kx00ix1exc3x00mx00 x00tx00rx00ax00|x00xd6x00lx00xe7x00ex00kx00|"
>>> print()

>>> print('utf-8  w/ BOM decoded with utf-8     %r' % e8s.decode('utf-8'))
utf-8  w/ BOM decoded with utf-8     '/ufeffABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> print('utf-8  w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig'))
utf-8  w/ BOM decoded with utf-8-sig 'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> print('utf-16 w/ BOM decoded with utf-16    %r' % e16.decode('utf-16'))
utf-16 w/ BOM decoded with utf-16    'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> print('utf-16 w/ BOM decoded with utf-16le  %r' % e16.decode('utf-16le'))
utf-16 w/ BOM decoded with utf-16le  '/ufeffABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'

值得注意的是,只有在和之后utf-8-sig才能utf-16返回原始字符串。encode`decode`

解决方案 7:

这个问题基本上是在您以UTF-8 或 UTF-16 编码保存 Python 代码时出现的,因为 Python 会自动在代码开头添加一些特殊字符(文本编辑器不会显示)来识别编码格式。但是,当您尝试执行代码时,它会在第 1 行(即代码开头)给出语法错误,因为Python 编译器理解 ASCII 编码。当您使用read()函数查看文件的代码时,您可以看到在返回代码的开头显示了'/ufeff'。解决此问题最简单的方法就是将编码改回 ASCII 编码(为此,您可以将代码复制到记事本并保存。记住!选择 ASCII 编码...希望这会有所帮助。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用