84

パス変数のエンコードとSQLiteデータベースへの挿入に問題があります。役に立たなかったencode("utf-8")関数で解決しようとしました。次に、タイプunicodeを提供するunicode()関数を使用しました。

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 ビットのバイト文字列を使用しないでください。代わりに、アプリケーションを Unicode 文字列に切り替えることを強くお勧めします。

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です

4

3 に答える 3

130

strはバイト単位のテキスト表現、unicodeは文字単位のテキスト表現です。

テキストをバイトからユニコードにデコードし、ユニコードを何らかのエンコーディングでバイトにエンコードします。

あれは:

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

UPD Sep 2020 : Python 2 が主に使用されていたときに回答が書かれました。Python 3 では、strに名前が変更されbytes、に名前unicodeが変更されましたstr

>>> b'abc'.decode('utf-8') # bytes to str
'abc'
>>> 'abc'.encode('utf-8'). # str to bytes
b'abc'
于 2012-04-23T21:08:53.367 に答える
88

使い方がencode("utf-8")間違っています。Python バイト文字列 ( strtype) にはエンコーディングがありますが、Unicode にはありません。を使用して Unicode 文字列を Python バイト文字列に変換できます。また、 (または同等の)uni.encode(encoding)を使用してバイト文字列を Unicode 文字列に変換できます。s.decode(encoding)unicode(s, encoding)

fullFilePathpathが現在タイプである場合strは、それらがどのようにエンコードされているかを理解する必要があります。たとえば、現在のエンコーディングが utf-8 の場合、次を使用します。

path = path.decode('utf-8')
fullFilePath = fullFilePath.decode('utf-8')

これで解決しない場合、実際の問題は、execute()呼び出しで Unicode 文字列を使用していない可能性があるため、次のように変更してみてください。

cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
于 2012-04-23T21:15:32.850 に答える