“유니코드인코드오류:'ascii' 코덱은 문자를 인코딩할 수 없습니다."
-
22-07-2019 - |
문제
정규식을 통해 임의의 HTML로 구성된 큰 문자열을 전달하려고 하는데 Python 2.6 스크립트가 이것으로 인해 질식하고 있습니다.
유니코드인코드오류:'ascii' 코덱은 문자를 인코딩할 수 없습니다.
나는 이 단어 끝에 있는 상표 위 첨자를 추적해 보았습니다.Protection™ – 앞으로도 이와 같은 사람들을 만날 것으로 예상됩니다.
ASCII가 아닌 문자를 처리하는 모듈이 있습니까?또는 Python에서 ASCII가 아닌 항목을 처리/이스케이프하는 가장 좋은 방법은 무엇입니까?
감사해요!전체 오류:
E
======================================================================
ERROR: test_untitled (__main__.Untitled)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\Test2.py", line 26, in test_untitled
ofile.write(Whois + '\n')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 1005: ordinal not in range(128)
전체 스크립트:
from selenium import selenium
import unittest, time, re, csv, logging
class Untitled(unittest.TestCase):
def setUp(self):
self.verificationErrors = []
self.selenium = selenium("localhost", 4444, "*firefox", "http://www.BaseDomain.com/")
self.selenium.start()
self.selenium.set_timeout("90000")
def test_untitled(self):
sel = self.selenium
spamReader = csv.reader(open('SubDomainList.csv', 'rb'))
for row in spamReader:
sel.open(row[0])
time.sleep(10)
Test = sel.get_text("//html/body/div/table/tbody/tr/td/form/div/table/tbody/tr[7]/td")
Test = Test.replace(",","")
Test = Test.replace("\n", "")
ofile = open('TestOut.csv', 'ab')
ofile.write(Test + '\n')
ofile.close()
def tearDown(self):
self.selenium.stop()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()
해결책
바이트열을 무언가에 전달하려고 하지만 제공하는 정보가 부족하여 이를 알려주는 것이 불가능합니다. 무엇 당신은 그것을 전달하려고합니다.ASCII(기본 코덱)로 인코딩할 수 없는 유니코드 문자열로 시작하므로 다른 코덱으로 인코딩해야 합니다(또는 @R.Pate가 제안한 대로 음역). 말하다 무엇 우리는 바이트열을 전달하는 내용을 모르기 때문에 알 수 없는 하위 시스템이 코덱 측면에서 무엇을 받아들이고 올바르게 처리할 수 있는지 모르기 때문에 사용해야 합니다.
당신이 우리를 내버려두신 그 완전한 어둠 속에서, utf-8
합리적인 블라인드 추측입니다(모든 유니코드 문자열을 정확하게 바이트열로 표현할 수 있는 코덱이고 XML과 같은 다양한 목적을 위한 표준 코덱이므로). 그러나 이는 블라인드 추측에 지나지 않습니다. 그리고 당신이 우리에게 더 많은 것을 말해주지 않는 한 무엇 당신은 그 바이트 스트링을 어떤 목적으로 전달하려고합니다.
통과 thestring.encode('utf-8')
맨발보다는 thestring
지금 보고 있는 특정 오류는 확실히 방지할 수 있지만 이로 인해 이상한 디스플레이(또는 그 어떤 것이든)가 발생할 수 있습니다. ~이다 당신은 그 바이트 스트링으로 작업을 시도하고 있습니다!) 수신자가 utf-8 인코딩을 받아들일 준비가 되어 있지 않고 기꺼이 받아들일 수 없다면 (그리고 수신자가 무엇인지 전혀 모르는데 어떻게 알 수 있습니까?!-)
다른 팁
"엄격한"모드에서 유니 코드를 ASCII로 변환하려고합니다.
>>> help(str.encode)
Help on method_descriptor:
encode(...)
S.encode([encoding[,errors]]) -> object
Encodes S using the codec registered for encoding. encoding defaults
to the default encoding. errors may be given to set a different error
handling scheme. Default is 'strict' meaning that encoding errors raise
a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and
'xmlcharrefreplace' as well as any other name registered with
codecs.register_error that is able to handle UnicodeEncodeErrors.
당신은 아마 다음 중 하나와 같은 것을 원할 것입니다.
s = u'Protection™'
print s.encode('ascii', 'ignore') # removes the ™
print s.encode('ascii', 'replace') # replaces with ?
print s.encode('ascii','xmlcharrefreplace') # turn into xml entities
print s.encode('ascii', 'strict') # throw UnicodeEncodeErrors
"가장 좋은"방법은 항상 요구 사항에 따라 다릅니다. 그래서, 당신은 무엇입니까? ASCII를 무시하는 것이 적절합니까? ™를 "(TM)"로 교체해야합니까? (이 예제에 대해 멋지게 보이지만 다른 코드 포인트에 대해 빠르게 분류됩니다. 그러나 그것은 당신이 원하는 것일 수 있습니다.) 예외는 정확히 필요한 것일 수 있습니다. 이제 어떤 식 으로든 처리해야합니까?
당신 만이이 질문에 답할 수 있습니다.
우선, 영어 (또는 필요한 경우 다른 사람)에 대한 번역을 설치해보십시오.
sudo apt-get install language-pack-en
모든 지원되는 패키지 (파이썬 포함)에 대한 번역 데이터 업데이트를 제공합니다.
코드에서 올바른 인코딩을 사용해야합니다.
예를 들어:
open(foo, encoding='utf-8')
그런 다음 값과 같은 시스템 구성을 두 번 확인하십시오 LANG
또는 로케일 구성 (/etc/default/locale
) 그리고 당신의 세션을 다시 로그인하는 것을 잊지 마십시오.