Hướng dẫn how do i remove ufeff in python? - làm cách nào để xóa ufeff trong python?

Tôi gặp lỗi với thông báo ngoại lệ sau:

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

Không chắc u'\ufeff' là gì, nó hiển thị khi tôi quét web. Làm thế nào tôi có thể khắc phục tình hình? Phương thức chuỗi .replace() không hoạt động trên nó.

Hướng dẫn how do i remove ufeff in python? - làm cách nào để xóa ufeff trong python?

Joël

2.61918 Huy hiệu bạc35 Huy hiệu đồng18 silver badges35 bronze badges

Hỏi ngày 28 tháng 7 năm 2013 lúc 20:02Jul 28, 2013 at 20:02

James Hallenjames HallenJames Hallen

4.0144 Huy hiệu vàng21 Huy hiệu bạc28 Huy hiệu đồng4 gold badges21 silver badges28 bronze badges

4

Tôi đã gặp phải điều này trên Python 3 và tìm thấy câu hỏi này (và giải pháp). Khi mở tệp, Python 3 hỗ trợ từ khóa mã hóa để tự động xử lý mã hóa.

Không có nó, BOM được bao gồm trong kết quả đọc:

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

Đưa ra mã hóa chính xác, BOM bị bỏ qua trong kết quả:

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

Chỉ cần 2 xu của tôi.

Đã trả lời ngày 7 tháng 3 năm 2018 lúc 11:25Mar 7, 2018 at 11:25

5

Ký tự Unicode U+FEFF là dấu thứ tự byte, hoặc BOM và được sử dụng để cho biết sự khác biệt giữa mã hóa UTF-16 lớn và ít endian. Nếu bạn giải mã trang web bằng codec phù hợp, Python sẽ xóa nó cho bạn. Ví dụ:

#!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')

Lưu ý rằng

>>> f = open('file', mode='r')
>>> f.read()
'\ufefftest'
0 là BOM được mã hóa UTF-8. Nó không bắt buộc đối với UTF-8, nhưng chỉ phục vụ như một chữ ký (thường là trên Windows).

Đầu ra:

utf-8     'ABC'
utf-8-sig '\xef\xbb\xbfABC'
utf-16    '\xff\xfeA\x00B\x00C\x00'    # Adds BOM and encodes using native processor endian-ness.
utf-16le  'A\x00B\x00C\x00'
utf-16be  '\x00A\x00B\x00C'

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.

Lưu ý rằng codec

>>> f = open('file', mode='r')
>>> f.read()
'\ufefftest'
1 yêu cầu BOM phải có mặt hoặc Python sẽ không biết liệu dữ liệu là lớn hay ít.

Đã trả lời ngày 28 tháng 7 năm 2013 lúc 20:56Jul 28, 2013 at 20:56

Hướng dẫn how do i remove ufeff in python? - làm cách nào để xóa ufeff trong python?

Mark Tolonenmark TolonenMark Tolonen

155K23 Huy hiệu vàng162 Huy hiệu bạc234 Huy hiệu Đồng23 gold badges162 silver badges234 bronze badges

1

Nhân vật đó là BOM hoặc "Dấu thứ tự byte". Nó thường được nhận dưới dạng một vài byte đầu tiên của một tệp, cho bạn biết cách diễn giải mã hóa phần còn lại của dữ liệu. Bạn chỉ có thể loại bỏ nhân vật để tiếp tục. Mặc dù, vì lỗi cho biết bạn đang cố gắng chuyển đổi thành 'ASCII', có lẽ bạn nên chọn một mã hóa khác cho bất cứ điều gì bạn đang cố gắng làm.

Đã trả lời ngày 28 tháng 7 năm 2013 lúc 20:10Jul 28, 2013 at 20:10

Swstepheswstepheswstephe

1.76210 Huy hiệu bạc17 Huy hiệu đồng10 silver badges17 bronze badges

Nội dung bạn đang quét được mã hóa trong Unicode thay vì văn bản ASCII và bạn đang nhận được một ký tự không chuyển đổi thành ASCII. Quyền 'dịch' phụ thuộc vào trang web gốc nghĩ nó là gì. Trang Unicode của Python cung cấp nền tảng về cách thức hoạt động.

Bạn đang cố gắng in kết quả hoặc dán nó vào một tệp? Lỗi cho thấy nó đang viết dữ liệu gây ra vấn đề, không đọc nó. Câu hỏi này là một nơi tốt để tìm kiếm các bản sửa lỗi.

Đã trả lời ngày 28 tháng 7 năm 2013 lúc 20:15Jul 28, 2013 at 20:15

Hướng dẫn how do i remove ufeff in python? - làm cách nào để xóa ufeff trong python?

Theodoxtheodoxtheodox

11.9k3 Huy hiệu vàng21 Huy hiệu bạc36 Huy hiệu đồng3 gold badges21 silver badges36 bronze badges

Đây là dựa trên câu trả lời từ Mark Tolonen. Chuỗi bao gồm các ngôn ngữ khác nhau của từ 'kiểm tra' được phân tách bởi '|', vì vậy bạn có thể thấy sự khác biệt.

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'))

Đây là một lần chạy thử:

>>> 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'ABCtest\xce\xb2\xe8\xb2\x9d\xe5\xa1\x94\xec\x9c\x84m\xc3\xa1sb\xc3\xaata|test|\xd8\xa7\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1|\xe6\xb5\x8b\xe8\xaf\x95|\xe6\xb8\xac\xe8\xa9\xa6|\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88|\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe|\xe0\xb4\xaa\xe0\xb4\xb0\xe0\xb4\xbf\xe0\xb4\xb6\xe0\xb5\x8b\xe0\xb4\xa7\xe0\xb4\xa8|\xd7\xa4\xd6\xbc\xd7\xa8\xd7\x95\xd7\x91\xd7\x99\xd7\xa8\xd7\x9f|ki\xe1\xbb\x83m tra|\xc3\x96l\xc3\xa7ek|'
>>> print('utf-8-sig %r' % e8s)
utf-8-sig b'\xef\xbb\xbfABCtest\xce\xb2\xe8\xb2\x9d\xe5\xa1\x94\xec\x9c\x84m\xc3\xa1sb\xc3\xaata|test|\xd8\xa7\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1|\xe6\xb5\x8b\xe8\xaf\x95|\xe6\xb8\xac\xe8\xa9\xa6|\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88|\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe|\xe0\xb4\xaa\xe0\xb4\xb0\xe0\xb4\xbf\xe0\xb4\xb6\xe0\xb5\x8b\xe0\xb4\xa7\xe0\xb4\xa8|\xd7\xa4\xd6\xbc\xd7\xa8\xd7\x95\xd7\x91\xd7\x99\xd7\xa8\xd7\x9f|ki\xe1\xbb\x83m tra|\xc3\x96l\xc3\xa7ek|'
>>> print('utf-16    %r' % e16)
utf-16    b"\xff\xfeA\x00B\x00C\x00t\x00e\x00s\x00t\x00\xb2\x03\x9d\x8cTX\x04\xc7m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x00'\x06.\x06*\x06(\x06'\x061\x06|\x00Km\xd5\x8b|\x00,nf\x8a|\x00\xc60\xb90\xc80|\x00*\t0\t@\t\x15\tM\t7\t>\t|\x00*\r0\r?\r6\rK\r'\r(\r|\x00\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x05|\x00k\x00i\x00\xc3\x1em\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|\x00"
>>> print('utf-16le  %r' % e16le)
utf-16le  b"A\x00B\x00C\x00t\x00e\x00s\x00t\x00\xb2\x03\x9d\x8cTX\x04\xc7m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x00'\x06.\x06*\x06(\x06'\x061\x06|\x00Km\xd5\x8b|\x00,nf\x8a|\x00\xc60\xb90\xc80|\x00*\t0\t@\t\x15\tM\t7\t>\t|\x00*\r0\r?\r6\rK\r'\r(\r|\x00\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x05|\x00k\x00i\x00\xc3\x1em\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|\x00"
>>> print('utf-16be  %r' % e16be)
utf-16be  b"\x00A\x00B\x00C\x00t\x00e\x00s\x00t\x03\xb2\x8c\x9dXT\xc7\x04\x00m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x06'\x06.\x06*\x06(\x06'\x061\x00|mK\x8b\xd5\x00|n,\x8af\x00|0\xc60\xb90\xc8\x00|\t*\t0\t@\t\x15\tM\t7\t>\x00|\r*\r0\r?\r6\rK\r'\r(\x00|\x05\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x00|\x00k\x00i\x1e\xc3\x00m\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|"
>>> 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|'

Thật đáng để biết rằng chỉ có cả

>>> f = open('file', mode='r')
>>> f.read()
'\ufefftest'
2 và
>>> f = open('file', mode='r')
>>> f.read()
'\ufefftest'
1 lấy lại chuỗi ban đầu sau cả
>>> f = open('file', mode='r')
>>> f.read()
'\ufefftest'
4 và
>>> f = open('file', mode='r')
>>> f.read()
'\ufefftest'
5.

Đã trả lời ngày 26 tháng 2 năm 2020 lúc 19:14Feb 26, 2020 at 19:14

Caotcaotcaot

2.78631 huy hiệu bạc35 huy hiệu đồng31 silver badges35 bronze badges

Vấn đề này phát sinh về cơ bản khi bạn lưu mã Python của mình trong mã hóa UTF-8 hoặc UTF-16 vì Python thêm một số ký tự đặc biệt khi tự động bắt đầu mã (không được hiển thị bởi các trình chỉnh sửa văn bản) để xác định định dạng mã hóa. Nhưng, khi bạn cố gắng thực thi mã, nó cung cấp cho bạn lỗi cú pháp trong dòng 1, tức là bắt đầu mã vì trình biên dịch Python hiểu mã hóa ASCII. Khi bạn xem mã tệp bằng hàm đọc (), bạn có thể thấy ở đầu mã được trả về '\ ufeff' được hiển thị. Một giải pháp đơn giản nhất cho vấn đề này chỉ là bằng cách thay đổi mã hóa trở lại mã hóa ASCII (đối với điều này, bạn có thể sao chép mã của mình vào một notepad và lưu nó hãy nhớ! Chọn mã hóa ASCII ... hy vọng điều này sẽ giúp ích.UTF-8 or UTF-16 encoding because python add some special character at the beginning of the code automatically (which is not shown by the text editors) to identify the encoding format. But, when you try to execute the code it gives you the syntax error in line 1 i.e, start of code because python compiler understands ASCII encoding. when you view the code of file using read() function you can see at the begin of the returned code '\ufeff' is shown. The one simplest solution to this problem is just by changing the encoding back to ASCII encoding(for this you can copy your code to a notepad and save it Remember! choose the ASCII encoding... Hope this will help.

Đã trả lời ngày 11 tháng 4 năm 2017 lúc 13:23Apr 11, 2017 at 13:23

Hướng dẫn how do i remove ufeff in python? - làm cách nào để xóa ufeff trong python?

Làm cách nào để xóa ký tự BOM khỏi tệp CSV?

Tải xuống Notepad ++ ..
Để kiểm tra xem ký tự BOM có tồn tại không, hãy mở tệp trong Notepad ++ và nhìn vào góc dưới bên phải. Nếu nó nói UTF-8-BOM thì tệp chứa ký tự BOM ..
Để xóa ký tự BOM, hãy chuyển đến mã hóa và chọn mã hóa trong UTF-8 ..
Lưu tệp và thử lại việc nhập ..

Ufeff ở Python là gì?

Ký tự Unicode U+Feff là dấu thứ tự byte hoặc BOM và được sử dụng để cho biết sự khác biệt giữa mã hóa UTF-16 lớn và ít endian.Nếu bạn giải mã trang web bằng codec phù hợp, Python sẽ xóa nó cho bạn.

Sự khác biệt giữa UTF là gì

"Sig" trong "UTF-8-SIG" là viết tắt của "chữ ký" (tức là tệp UTF-8 chữ ký).Sử dụng UTF-8-SIG để đọc tệp sẽ coi BOM là siêu dữ liệu giải thích cách giải thích tệp, thay vì là một phần của nội dung tệp.. Using utf-8-sig to read a file will treat the BOM as metadata that explains how to interpret the file, instead of as part of the file contents.

Nhân vật BOM là gì?

Khi bắt đầu một trang sử dụng mã hóa ký tự Unicode, bạn có thể tìm thấy một số byte đại diện cho dấu lệnh unicode mã U+feff byte (viết tắt là BOM).Tên byte Byte Mark là một bí danh cho tên ký tự gốc Zero Width No-Break Space (ZWNBSP).BYTE ORDER MARK (abbreviated as BOM ). The name BYTE ORDER MARK is an alias for the original character name ZERO WIDTH NO-BREAK SPACE (ZWNBSP).