path変数のエンコードとSQLiteデータベースへの挿入に問題があります。 encode( "utf-8")関数で解決しようとしましたが、助けにはなりませんでした。次に、nicode()を使用して、nicodeと入力します。
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'>
最後にnicode typeを取得しましたが、path変数のtypeが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変数のエンコードを変更するのを忘れてしまいましたが、これは同じ問題に悩まされていますが、今はかなり混乱しています。 nicode()またはencode( "utf-8")のみ、またはその両方を使用する必要がありますか?
使えない
fullFilePath = unicode(fullFilePath.encode("utf-8"))
このエラーが発生するため:
UnicodeDecodeError: 'ascii'コーデックは位置32のバイト0xc5をデコードできません:序数が範囲外(128)
Pythonバージョンは2.7.2
encode("utf-8")
を誤って使用しています。 Pythonバイト文字列(str
タイプ)にはエンコードがありますが、Unicodeにはありません。 uni.encode(encoding)
を使用してUnicode文字列をPythonバイト文字列に変換できます。また、s.decode(encoding)
(または同等に、unicode(s, encoding)
)を使用してバイト文字列をUnicode文字列に変換できます。
fullFilePath
とpath
が現在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())
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
。