PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Python + PostgreSQL + странен ascii =UTF8 грешка при кодиране

Въпросът започва с невярна предпоставка:

ASCII знаците са в диапазона от "\x00" до "\x7F" включително.

По-рано приетият сега изтрит отговор е действал при две груби погрешни разбирания (1) че локалът ==кодиране (2) че кодирането latin1 преобразува "\x80" в знак за евро.

Всъщност всички кодировки на ISO-8859-x преобразуват "\x80" в U+0080, което е един от контролните знаци C1, а не знак за евро. Само 3 от тези кодировки (x в (7, 15, 16)) предоставят знака за евро като "\xA4". Вижте тази статия в Wikipedia .

Трябва да знаете в какво кодиране са вашите данни. На каква машина са създадени? как? Локалът, в който е създаден (не непременно ваш), може да ви даде представа.

Обърнете внимание, че „Данните ми са кодирани на latin1“ е горе с „Чекът е изпратен по пощата“ и „Разбира се, че ще те обичам сутринта“. Вашите данни вероятно са кодирани в едно от кодировките cp125x, намиращи се на платформи на Windows. Обърнете внимание, че всички те, с изключение на 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получете различни последователни периоди от време от припокриващи се интервали от време

  2. Как да върнете записи в правилен ред в PostgreSQL

  3. postgreSQL Fibonacci Sequence - Заявката няма местоназначение за данните за резултатите

  4. Грешка при импортиране на CSV в postgres с python и psycopg2

  5. SELECT DISTINCT е по-бавен от очакваното в моята таблица в PostgreSQL