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


83

경로 변수 를 인코딩 하고 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입니다.


오류를 발생시키는 코드는 어디에 있습니까?
newtover

2
귀하의 정확한 질문은 이미 답변되었습니다. [ stackoverflow.com/questions/2392732/… [1] : stackoverflow.com/questions/2392732/…
garnertb

@newtover 질문을 편집했습니다.
xralf 2012

사용한 변수를 모두로 변환 unicode했습니까?
newtover 2011

2
Python 3 텍스트와 데이터를 처리 하는 방법을 배우는 것은 모든 것을 이해하는 데 정말 도움이되었습니다. 그러면 지식을 Python 2에 쉽게 적용 할 수 있습니다.
Oleh Prypin 2011

답변:


87

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

이 문은 fullFilePath = fullFilePath.decode("utf-8")여전히 오류를 발생시킵니다 UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128). fullFilePath는 utf-8 인코딩이어야하는 db 테이블의 텍스트 열 에서 가져온 str 유형 과 문자열 의 조합입니다 .
xralf 2012

에 따르면 있지만, UTF-8, UTF-16BE 또는 UTF-16LE 수 있습니다. 어떻게 든 알아낼 수 있습니까?
xralf 2012

@xralf, 다른 str개체를 결합하는 경우 인코딩을 혼합 할 수 있습니다. 결과를 보여줄 수 있습니까 print repr(fullFilePath)?
Andrew Clark

decode () 호출하기 전에 만 표시 할 수 있습니다 . 문제가있는 문자는 \ u0161 및 \ u0165입니다.
xralf 2012

@xralf-이미 유니 코드입니까? 실행 호출을 유니 코드로 변경해보십시오.cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
Andrew Clark

121

str바이트 단위의 unicode텍스트 표현이고 문자 단위의 텍스트 표현입니다.

텍스트를 바이트에서 유니 코드로 디코딩하고 일부 인코딩을 사용하여 유니 코드를 바이트로 인코딩합니다.

그건:

>>> 'abc'.decode('utf-8')  # str to unicode
u'abc'
>>> u'abc'.encode('utf-8') # unicode to str
'abc' 

1
아주 좋은 대답입니다. 나는 unicode문자 또는 기호에 대해 말하거나 더 일반적으로 추가 할 것입니다 . str 은 특정 인코딩에서 바이트 문자열 을 나타내며 decode, 특정 룬을 얻으려면 (분명히 올바른 인코딩으로) 해야합니다
arainone

1

쉘에서 스크립트를 실행하기 직전에 로케일 설정을 지정했는지 확인하십시오.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.