[python] Python에서 unicode () 및 encode () 함수 사용

경로 변수 를 인코딩 하고 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))를 사용하여 바이트 문자열을 유니 코드 문자열로 변환 할 수 있습니다 .

경우 fullFilePathpath현재있는 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.


답변