PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Python + PostgreSQL + dziwne ascii =błąd kodowania UTF8

Pytanie zaczyna się od fałszywej przesłanki:

Znaki ASCII mieszczą się w zakresie od „\x00” do „\x7F” włącznie.

Wcześniej zaakceptowana, teraz usunięta odpowiedź działała pod dwoma rażącymi nieporozumieniami (1) lokalizacja ==kodowanie (2) kodowanie latin1 odwzorowuje „\x80” na znak Euro.

W rzeczywistości wszystkie kodowania ISO-8859-x mapują „\x80” na U+0080, który jest jednym ze znaków kontrolnych C1, a nie znakiem Euro. Tylko 3 z tych kodowań (x w (7, 15, 16)) zapewniają znak Euro, jako "\xA4". Zobacz ten artykuł w Wikipedii .

Musisz wiedzieć w jakim kodowaniu znajdują się twoje dane. Na jakiej maszynie zostały one utworzone? Jak? Lokalizacja, w której został utworzony (niekoniecznie twój), może dać ci wskazówkę.

Zwróć uwagę, że „Moje dane są zakodowane w języku łacińskim1” znajduje się tam z „Ckiem wysłanym pocztą” i „Oczywiście, że będę cię kochać rano”. Twoje dane są prawdopodobnie zakodowane w jednym z kodowań cp125x, które można znaleźć na platformach Windows. Zauważ, że wszystkie z wyjątkiem cp1251 (cyrylica Windows) mapują "\x80" na znak 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']

Aktualizacja w odpowiedzi na komentarz OP

To trochę mylące:najpierw mówisz

Ale później mówisz

Proszę wyjaśnić.

Wybór odpowiedniego kodowania cp125x:Gdzie (lokalizacja geograficzna) został utworzony plik? W jakim języku (językach) jest napisany tekst? Jakieś znaki inne niż domniemane euro z wartościami> "\x7f"? Jeśli tak, to w jakim kontekście iw jakim kontekście?

Aktualizacja 2 Jeśli „nie wiesz, jak napisany jest program”, ani ty, ani my nie możemy wyrobić sobie opinii, czy zawsze używa „\x80” dla znaku euro. Chociaż robienie tego inaczej byłoby monumentalną głupstwem, nie można tego wykluczyć.

Jeśli tekst jest napisany w języku angielskim i/lub jest napisany w USA i/lub jest napisany na platformie Windows, to jest całkiem pewne, że cp1252 to droga do zrobienia ... dopóki nie uzyskasz dowodów przeciwnych, w którym to przypadku będziesz musiał sam odgadnąć kodowanie lub odpowiedzieć na pytania (w jakim języku, w jakiej lokalizacji).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak za pomocą django sprawdzić, czy coś istnieje w bazie postgresql?

  2. Zgłaszanie błędów w postgreSQL

  3. Postgres nie może otworzyć pliku CSV w celu odczytu:odmowa uprawnień

  4. Ładowanie spakowanego pliku CSV (nazwapliku.csv.gz) do tabeli PostgreSQL

  5. Utwórz json z wartościami kolumn jako kluczami obiektów