PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Python + PostgreSQL + ascii aneh =kesalahan penyandian UTF8

Pertanyaannya dimulai dengan premis yang salah:

Karakter ASCII berada dalam rentang "\x00" hingga "\x7F" inklusif.

Jawaban yang diterima sebelumnya sekarang dihapus dioperasikan di bawah dua kesalahpahaman besar (1) lokal itu ==encoding (2) bahwa encoding latin1 memetakan "\x80" ke karakter Euro.

Faktanya, semua pengkodean ISO-8859-x memetakan "\x80" ke U+0080 yang merupakan salah satu karakter kontrol C1, bukan karakter Euro. Hanya 3 dari penyandian tersebut (x in (7, 15, 16)) yang memberikan karakter Euro, sebagai "\xA4". Lihat artikel Wikipedia ini .

Anda perlu tahu apa pengkodean data Anda. Mesin apa yang dibuatnya? Bagaimana? Lokal tempat pembuatannya (belum tentu milik Anda) dapat memberi Anda petunjuk.

Perhatikan bahwa "Data saya dikodekan dalam bahasa latin1" ada di sana dengan "Cek ada di pos" dan "Tentu saja aku akan mencintaimu di pagi hari". Data Anda mungkin dikodekan dalam salah satu pengkodean cp125x yang ditemukan di platform Windows. Perhatikan bahwa semuanya kecuali cp1251 (Windows Cyrillic) memetakan "\x80" ke karakter euro:

>>> ['\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']

Perbarui sebagai tanggapan atas komentar OP

Ini agak membingungkan:Pertama Anda katakan

Tapi nanti kamu bilang

Tolong jelaskan.

Memilih penyandian cp125x yang sesuai:Di ​​mana (lokasi geografis) file dibuat? Dalam bahasa apa teks itu ditulis? Adakah karakter selain euro yang diduga dengan nilai> "\x7f"? Jika demikian, yang mana dan dalam konteks apa mereka digunakan?

Perbarui 2 Jika Anda tidak "tahu bagaimana program ini ditulis", baik Anda maupun kami tidak dapat memberikan pendapat apakah program selalu menggunakan "\x80" untuk karakter euro. Meskipun melakukan sebaliknya akan menjadi kekonyolan yang monumental, itu tidak dapat dikesampingkan.

Jika teks ditulis dalam bahasa Inggris dan/atau ditulis di AS, dan/atau ditulis pada platform Windows, maka cukup pasti bahwa cp1252 adalah cara untuk pergi ... sampai Anda mendapatkan bukti sebaliknya, dalam hal ini Anda harus menebak penyandian sendiri atau menjawab pertanyaan (bahasa apa, lokalitas apa).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Langkah-langkah untuk Memecahkan Masalah Django.db.utils.ProgrammingError:izin ditolak untuk relasi django_migrations

  2. Cara mengaktifkan mode senyap untuk perintah Postgres di Heroku

  3. Pernyataan IF-THEN-ELSE di postgresql

  4. Mengapa item urutan Postgres naik meskipun pembuatan objek gagal?

  5. Kesalahan Database Postgres:relasi tidak ada