web-dev-qa-db-ja.com

Pythonでのunicode()およびencode()関数の使用

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

79
xralf

encode("utf-8")を誤って使用しています。 Pythonバイト文字列(strタイプ)にはエンコードがありますが、Unicodeにはありません。 uni.encode(encoding)を使用してUnicode文字列をPythonバイト文字列に変換できます。また、s.decode(encoding)(または同等に、unicode(s, encoding))を使用してバイト文字列をUnicode文字列に変換できます。

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())
84
Andrew Clark

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

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

あれは:

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

シェルからスクリプトを実行する直前にロケール設定を設定したことを確認してください。

$ 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 localeman setlocale

1
kenorb