sql >> データベース >  >> RDS >> PostgreSQL

Python +PostgreSQL+奇妙なASCII=UTF8エンコーディングエラー

    質問は誤った前提から始まります:

    ASCII文字は「\x00」から「\x7F」までの範囲です。

    以前に受け入れられ、現在削除されている回答は、2つの重大な誤解の下で機能しました (1)そのロケール==エンコーディング(2)latin1エンコーディングが「\x80」をユーロ文字にマップすること。

    実際、すべてのISO-8859-xエンコーディングは、「\x80」をユーロ文字ではなくC1制御文字の1つであるU+0080にマップします。これらのエンコーディングのうち3つ((7、15、16)のx)のみが、「\xA4」のようにユーロ文字を提供します。 このウィキペディアの記事 を参照してください。 。

    知る必要があります データはどのエンコーディングで作成されていますか?どのマシンで作成されましたか?どのように?それが作成されたロケール(必ずしもあなたのものではない)があなたに手がかりを与えるかもしれません。

    「私のデータはlatin1でエンコードされています」は、「小切手は郵送中です」と「もちろん、朝はあなたを愛します」と書かれていることに注意してください。データは、Windowsプラットフォームにあるcp125xエンコーディングの1つでエンコードされている可能性があります。 cp1251(Windowsキリル文字)を除くすべてが「\ x80」をユーロ文字にマップすることに注意してください:

    >>> ['\x80'.decode('cp125' + str(x), 'replace') for x in range(9)]
    [u'\u20ac', u'\u0402', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac']
    

    更新 OPのコメントに応えて

    これは少し紛らわしいです:最初にあなたが言う

    しかし後であなたは言う

    説明してください。

    適切なcp125xエンコーディングの選択:ファイルはどこ(地理的な場所)で作成されましたか?テキストはどの言語で書かれていますか?推定ユーロ以外の値が"\x7f"以上の文字はありますか?もしそうなら、それらはどのコンテキストでどのようなコンテキストで使用されていますか?

    アップデート2 「プログラムの書き方がわからない」場合は、ユーロ文字に常に「\x80」を使用するかどうかについて意見を述べることはできません。そうでなければ、途方もない愚かさになるでしょうが、それを排除することはできません。

    テキストが英語で書かれている、および/または米国で書かれている、および/またはWindowsプラットフォームで書かれている場合、cp1252 反対の証拠が得られるまで、これが進むべき道です。その場合は、自分でエンコーディングを推測するか、(どの言語、どの地域)の質問に答える必要があります。




    1. NEWテーブルとOLDテーブルをトリガーからMySQLのプロシージャに渡すことは可能ですか?

    2. Oracle Forms App から POST データを読み取る

    3. mysqlWHEREIN配列文字列/ユーザー名

    4. MySql-クエリキューはありますか