O que pode estar causando esse erro quando tento inserir um caractere estrangeiro no banco de dados?
>>UnicodeEncodeError: 'latin-1' codec can't encode character u'\u201c' in position 0: ordinal not in range(256)
E como faço para resolver isso?
Obrigado!
Respostas:
O caractere U + 201C Aspas duplas à esquerda não está presente na codificação Latin-1 (ISO-8859-1).
Ele está presente na página de código 1252 (Europa Ocidental). Esta é uma codificação específica do Windows baseada em ISO-8859-1, mas que coloca caracteres extras no intervalo 0x80-0x9F. A página de código 1252 é freqüentemente confundida com ISO-8859-1, e é um comportamento irritante, mas agora padrão, do navegador da web, se você servir suas páginas como ISO-8859-1, o navegador as tratará como cp1252. No entanto, eles realmente são duas codificações distintas:
Se você estiver usando seu banco de dados apenas como um armazenamento de bytes, você pode usar cp1252 para codificar
“
e outros caracteres presentes na página de código do Windows Western. Mas ainda outros caracteres Unicode que não estão presentes em cp1252 causarão erros.Você pode usar
encode(..., 'ignore')
para suprimir os erros livrando-se dos caracteres, mas realmente neste século você deve usar UTF-8 em seu banco de dados e em suas páginas. Esta codificação permite que qualquer caractere seja usado. Idealmente, você também deve informar ao MySQL que está usando strings UTF-8 (definindo a conexão do banco de dados e o agrupamento em colunas de string), para que possa obter comparação e classificação sem distinção entre maiúsculas e minúsculas.fonte
cp1252
um superconjunto estrito de ISO-8859-1? Ou seja, quando os navegadores recebem uma página ISO-8859-1, eles podem renderizá-la como se fosse CP1252, porque não haverá nenhum caractere do intervalo de0x80-0x9F
qualquer maneira.Encontrei esse mesmo problema ao usar o módulo Python MySQLdb. Como o MySQL permite que você armazene praticamente todos os dados binários que desejar em um campo de texto, independentemente do conjunto de caracteres, encontrei minha solução aqui:
Usando UTF8 com Python MySQLdb
Editar: citação do URL acima para atender à solicitação no primeiro comentário ...
fonte
A melhor solução é
goste deste comentário (adicionar
use_unicode=True
echarset="utf8"
)detalhe veja:
fonte
utf8mb4
para mysql se tiveremoji
.etc, consulte qual-é-a-diferença-entre-utf8mb4-and-utf8-charsets-in-mysqlEspero que seu banco de dados seja pelo menos UTF-8. Em seguida, você precisará executar
yourstring.encode('utf-8')
antes de tentar colocá-lo no banco de dados.fonte
Você está tentando armazenar um ponto de código Unicode
\u201c
usando uma codificaçãoISO-8859-1 / Latin-1
que não pode descrever esse ponto de código. Você pode precisar alterar o banco de dados para usar utf-8 e armazenar os dados da string usando uma codificação apropriada, ou pode desejar limpar suas entradas antes de armazenar o conteúdo; ou seja, usando algo como o excelente guia i18n de Sam Ruby . Ele fala sobre os problemas quewindows-1252
podem causar e sugere como processá-lo, além de links para exemplos de código!fonte
Os usuários do SQLAlchemy podem simplesmente especificar seus campos como
convert_unicode=True
.Exemplo:
sqlalchemy.String(1000, convert_unicode=True)
SQLAlchemy simplesmente aceitará objetos Unicode e os retornará, tratando da própria codificação.
Docs
fonte
Latin-1 (também conhecido como ISO 8859-1 ) é um esquema de codificação de caracteres de octeto único, e você não pode ajustar
\u201c
(“
) em um byte.Você quis dizer usar a codificação UTF-8?
fonte
\u0391
se encaixa perfeitamente em um byte (especificamente, byte 193). Você pode querer dar uma olhada nisso ; as pessoas acharam útil.Use o snippet abaixo para converter o texto do latim para o inglês
resultado:
fonte
Python: você precisará adicionar # - * - coding: UTF-8 - * - (remover os espaços ao redor de *) à primeira linha do arquivo python. e então adicione o seguinte ao texto para codificar: .encode ('ascii', 'xmlcharrefreplace') . Isso substituirá todos os caracteres Unicode por seu equivalente ASCII.
fonte