DostajęSQLAlchemy i UnicodeDecodeError
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
kiedy mijam tekst pochodzących z bazy danych MySQL, który I 'm dostęp przy użyciu SQLAlchemy, do tej funkcji:
re.compile(ur"<([^>]+)>", flags=re.UNICODE).sub(u" ", s)
Kodowanie bazy danych jest utf -8 i nawet przekazuję kodowanie do funkcji create_engine w SQLAlchemy.
Edit: To jak ja zapytań do bazy danych:
doc = session.query(Document).get(doc_id)
s = doc.title
sugestia, zdałem s.decode ('utf-8') do sub
. Błąd powyżej zniknął, ale pojawia się inny błąd dla innego dokumentu:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xeb in position 449: invalid continuation byte
tabela bazy danych jest zdefiniowany następująco:
CREATE TABLE `articles` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`cdate` datetime DEFAULT NULL,
`link` varchar(255) DEFAULT NULL,
`content` text,
UNIQUE KEY `id` (`id`),
UNIQUE KEY `link_idx` (`link`)
) ENGINE=InnoDB AUTO_INCREMENT=4127834 DEFAULT CHARSET=utf8;
Każda pomoc będzie bardzo mile widziane
Czy możemy zobaczyć więcej kodu? Skąd się wzięło 's'? Czy 's.decode ('utf8')' naprawi? –
@MartijnPieters dodając s.decode ('utf-8') naprawia błąd dla tego konkretnego dokumentu, ale jeśli próbuję uzyskać inny dokument z bazy danych, otrzymam: UnicodeDecodeError: kodek 'utf8' nie może dekodować bajtu 0xeb w pozycja 449: niepoprawny bajt kontynuacji. Więc ten sam błąd, inna postać. – user1491915
Nie, to inny błąd (jeden dekoduje z ascii, drugi z utf-8). Oznacza to, że drugi dokument w ogóle nie jest danymi UTF-8 *. Właśnie dlatego chcemy zobaczyć skąd pochodzi "s". –