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ó.
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
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
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