7

私は SQLite/Django に移植している MSSQL のデータベースを持っています。pymssql を使用してデータベースに接続し、テキスト フィールドをローカルの SQLite データベースに保存しています。

ただし、一部のキャラクターでは爆発します。次のような苦情が寄せられます。

UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 1916: ordinal not in range(128)

文字を適切な Unicode バージョンに変換する方法はありますか? それともそれらを取り除きますか?

4

2 に答える 2

11

デコードするときは、「ignore」を渡してそれらの文字を取り除きます

それらをストリッピング/変換する方法が他にもあります

'replace': replace malformed data with a suitable replacement marker, such as '?' or '\ufffd' 

'ignore': ignore malformed data and continue without further notice 

'backslashreplace': replace with backslashed escape sequences (for encoding only) 

テスト

>>> "abcd\x97".decode("ascii")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 4: ordinal not in range(128)
>>>
>>> "abcd\x97".decode("ascii","ignore")
u'abcd'
于 2010-03-24T15:18:08.243 に答える
11

bytes の文字列を取得sしたら、それを unicode obj として直接使用するのではなく、適切なコーデックで明示的に変換します。

u = s.decode('latin-1')

このポイントに続くコード (おそらく sqlite に書き込む部分) のu代わりに使用します。sこれは、もともとバイト文字列を作成するために使用されたエンコーディングであると想定しlatin-1ています。推測することは不可能なので、調べてみてください;-)。

原則として、アプリケーションでテキストをエンコードされたバイト文字列として処理しないでください。入力の直後にテキストを Unicode オブジェクトにデコードし、必要に応じて、出力の直前にバイト文字列にエンコードします。

于 2010-03-24T15:22:13.503 に答える