1. ホーム
  2. python

[解決済み] UnicodeEncodeError: 'latin-1' コーデックは文字をエンコードできない

2022-09-04 09:17:10

質問

データベースに外字を挿入しようとすると、このエラーが発生する原因は何でしょうか。

>>UnicodeEncodeError: 'latin-1' codec can't encode character u'\u201c' in position 0: ordinal not in range(256)

そして、どのように解決すればいいのでしょうか?

ありがとうございます。

どのように解決するのですか?

文字 U+201C 左ダブルクォーテーション記号は Latin-1 (ISO-8859-1) エンコーディングには存在しません。

それは は、コードページ 1252 (西ヨーロッパ) に存在します。これは Windows 固有のエンコーディングで、ISO-8859-1 に基づいていますが、0x80-0x9F の範囲に余分な文字を配置します。コードページ1252はしばしばISO-8859-1と混同され、ページをISO-8859-1として提供すると、ブラウザはそれを代わりにcp1252として扱うという、迷惑なことですが今では標準的なウェブブラウザの動作になっています。しかし、これらは実際には 2 つの異なるエンコーディングです。

>>> u'He said \u201CHello\u201D'.encode('iso-8859-1')
UnicodeEncodeError
>>> u'He said \u201CHello\u201D'.encode('cp1252')
'He said \x93Hello\x94'

データベースをバイトストアとしてのみ使用する場合、cp1252を使用してエンコードすることができます。 といった Windows ウエスタン コード ページに存在する文字をエンコードできます。しかし、cp1252 に存在しない他の Unicode 文字は、依然としてエラーの原因となります。

を使用することができます。 encode(..., 'ignore') を使って、文字を取り除くことでエラーを抑制することができます。しかし、実際にはこの世紀には、データベースとページの両方でUTF-8を使用すべきです。このエンコーディングでは、どんな文字でも使用することができます。また、理想的には MySQL に UTF-8 文字列を使用していることを伝えるべきです (データベース接続と文字列列の照合順序を設定することによって)。