경로 변수 를 인코딩 하고 SQLite 데이터베이스에 삽입하는 데 문제가 있습니다. 도움이되지 않는 encode ( “utf-8”) 함수 로 해결하려고했습니다 . 그럼 내가 사용하는 유니 코드 () 나 입력주는 기능 유니 코드를 .
print type(path) # <type 'unicode'>
path = path.replace("one", "two") # <type 'str'>
path = path.encode("utf-8") # <type 'str'> strange
path = unicode(path) # <type 'unicode'>
마지막으로 유니 코드 유형을 얻었 지만 경로 변수 의 유형 이 str 일 때 나타나는 동일한 오류가 여전히 있습니다.
sqlite3.ProgrammingError : 8 비트 바이트 열을 해석 할 수있는 text_factory (예 : text_factory = str)를 사용하지 않는 한 8 비트 바이트 열을 사용해서는 안됩니다. 대신 응용 프로그램을 유니 코드 문자열로 전환하는 것이 좋습니다.
이 오류를 해결하고 올바른 사용법 encode("utf-8")
및 unicode()
기능에 대해 설명해 주 시겠습니까? 나는 종종 그것으로 싸우고 있습니다.
편집하다:
이 execute () 문에서 오류가 발생했습니다.
cur.execute("update docs set path = :fullFilePath where path = :path", locals())
동일한 문제로 고통받는 fullFilePath 변수 의 인코딩을 변경하는 것을 잊었 지만 지금은 상당히 혼란 스럽습니다. unicode () 또는 encode ( “utf-8”) 또는 둘 다를 사용해야합니까 ?
나는 사용할 수 없다
fullFilePath = unicode(fullFilePath.encode("utf-8"))
이 오류가 발생하기 때문입니다.
UnicodeDecodeError : ‘ascii’코덱이 위치 32의 0xc5 바이트를 디코딩 할 수 없습니다. 서 수가 범위에 없습니다 (128).
Python 버전은 2.7.2입니다.
답변
encode("utf-8")
잘못 사용하고 있습니다. Python 바이트 문자열 ( str
유형)에는 인코딩이 있지만 유니 코드에는 없습니다. 를 사용하여 유니 코드 문자열을 Python 바이트 문자열 uni.encode(encoding)
로 변환 할 수 있으며 s.decode(encoding)
(또는 동등하게 unicode(s, encoding)
)를 사용하여 바이트 문자열을 유니 코드 문자열로 변환 할 수 있습니다 .
경우 fullFilePath
와 path
현재있는 str
유형들은 인코딩하는 방법, 당신은 파악해야한다. 예를 들어 현재 인코딩이 utf-8이면 다음을 사용합니다.
path = path.decode('utf-8')
fullFilePath = fullFilePath.decode('utf-8')
그래도 문제가 해결되지 않으면 execute()
호출 에서 유니 코드 문자열을 사용하지 않는 것이 실제 문제 일 수 있습니다 . 다음으로 변경해보십시오.
cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
답변
str
바이트 단위의 unicode
텍스트 표현이고 문자 단위의 텍스트 표현입니다.
텍스트를 바이트에서 유니 코드로 디코딩하고 일부 인코딩을 사용하여 유니 코드를 바이트로 인코딩합니다.
그건:
>>> 'abc'.decode('utf-8') # str to unicode
u'abc'
>>> u'abc'.encode('utf-8') # unicode to str
'abc'
답변
쉘에서 스크립트를 실행하기 직전에 로케일 설정을 지정했는지 확인하십시오.
$ locale -a | grep "^en_.\+UTF-8"
en_GB.UTF-8
en_US.UTF-8
$ export LC_ALL=en_GB.UTF-8
$ export LANG=en_GB.UTF-8
문서 : man locale
, man setlocale
.