python - UnicodeEncodeError: el códec ''latin-1'' no puede codificar caracteres
mysql pylons (8)
Carácter U + 201C La marca de comillas doble izquierda no está presente en la codificación Latin-1 (ISO-8859-1).
Está presente en la página de códigos 1252 (Europa occidental). Esta es una codificación específica de Windows que está basada en ISO-8859-1 pero que pone caracteres adicionales en el rango 0x80-0x9F. La página de códigos 1252 a menudo se confunde con ISO-8859-1, y es un comportamiento molesto pero ahora estándar del navegador web que si sirve sus páginas como ISO-8859-1, el navegador las tratará como cp1252. Sin embargo, en realidad son dos codificaciones distintas:
>>> u''He said /u201CHello/u201D''.encode(''iso-8859-1'')
UnicodeEncodeError
>>> u''He said /u201CHello/u201D''.encode(''cp1252'')
''He said /x93Hello/x94''
Si está utilizando su base de datos solo como un almacén de bytes, puede usar cp1252 para codificar “
y otros caracteres presentes en la página de códigos de Windows Western. Pero aún otros caracteres Unicode que no están presentes en cp1252 causarán errores.
Puede utilizar encode(..., ''ignore'')
para suprimir los errores al deshacerse de los caracteres, pero realmente en este siglo debe usar UTF-8 tanto en su base de datos como en sus páginas. Esta codificación permite que cualquier personaje sea utilizado. También debería decirle a MySQL que está utilizando cadenas UTF-8 (estableciendo la conexión de la base de datos y la intercalación en las columnas de cadena), de modo que pueda hacer una comparación y clasificación que no distinga entre mayúsculas y minúsculas.
¿Qué podría estar causando este error cuando trato de insertar un carácter extraño en la base de datos?
>>UnicodeEncodeError: ''latin-1'' codec can''t encode character u''/u201c'' in position 0: ordinal not in range(256)
¿Y cómo lo resuelvo?
¡Gracias!
Espero que su base de datos sea al menos UTF-8. Luego deberá ejecutar yourstring.encode(''utf-8'')
antes de intentar ponerlo en la base de datos.
Está intentando almacenar un punto de código Unicode /u201c
utilizando una codificación ISO-8859-1 / Latin-1
que no puede describir ese punto de código. O bien es posible que deba modificar la base de datos para usar utf-8 y almacenar los datos de cadena utilizando una codificación adecuada, o puede desear desinfectar sus entradas antes de almacenar el contenido; es decir, usando algo como la excelente guía i18n de Sam Ruby . Eso habla sobre los problemas que windows-1252
puede causar, y sugiere cómo procesarlo, además de enlaces al código de muestra.
La mejor solución es
- establece el juego de caracteres de mysql en ''utf-8''
haga
use_unicode=True
este comentario (agregueuse_unicode=True
ycharset="utf8"
)db = MySQLdb.connect (host = "localhost", usuario = "root", passwd = "", db = "testdb", use_unicode = Verdadero, charset = "utf8") - KyungHoon Kim Mar 13 ''14 a las 17:04
detalle ver:
class Connection(_mysql.connection):
"""MySQL Database Connection Object"""
default_cursor = cursors.Cursor
def __init__(self, *args, **kwargs):
"""
Create a connection to the database. It is strongly recommended
that you only use keyword parameters. Consult the MySQL C API
documentation for more information.
host
string, host to connect
user
string, user to connect as
passwd
string, password to use
db
string, database to use
port
integer, TCP/IP port to connect to
unix_socket
string, location of unix_socket to use
conv
conversion dictionary, see MySQLdb.converters
connect_timeout
number of seconds to wait before the connection attempt
fails.
compress
if set, compression is enabled
named_pipe
if set, a named pipe is used to connect (Windows only)
init_command
command which is run once the connection is created
read_default_file
file from which default client values are read
read_default_group
configuration group to use from the default file
cursorclass
class object, used to create cursors (keyword only)
use_unicode
If True, text-like columns are returned as unicode objects
using the connection''s character set. Otherwise, text-like
columns are returned as strings. columns are returned as
normal strings. Unicode objects will always be encoded to
the connection''s character set regardless of this setting.
charset
If supplied, the connection character set will be changed
to this character set (MySQL-4.1 and newer). This implies
use_unicode=True.
sql_mode
If supplied, the session SQL mode will be changed to this
setting (MySQL-4.1 and newer). For more details and legal
values, see the MySQL documentation.
client_flag
integer, flags to use or 0
(see MySQL docs or constants/CLIENTS.py)
ssl
dictionary or mapping, contains SSL connection parameters;
see the MySQL documentation for more details
(mysql_ssl_set()). If this is set, and the client does not
support SSL, NotSupportedError will be raised.
local_infile
integer, non-zero enables LOAD LOCAL INFILE; zero disables
autocommit
If False (default), autocommit is disabled.
If True, autocommit is enabled.
If None, autocommit isn''t set and server default is used.
There are a number of undocumented, non-standard methods. See the
documentation for the MySQL C API for some hints on what they do.
"""
Latin-1 (también conocido como ISO 8859-1 ) es un esquema de codificación de caracteres de un solo octeto, y no puede ajustar /u201c
( “
) en un byte.
¿Querías usar la codificación UTF-8?
Los usuarios de SQLAlchemy pueden simplemente especificar su campo como convert_unicode=True
.
Ejemplo: sqlalchemy.String(1000, convert_unicode=True)
SQLAlchemy simplemente aceptará objetos Unicode y los devolverá, manejando la codificación misma.
Me encontré con este mismo problema cuando uso el módulo Python MySQLdb. Como MySQL te permitirá almacenar casi cualquier información binaria que desees en un campo de texto independientemente del conjunto de caracteres, encontré mi solución aquí:
Usando UTF8 con Python MySQLdb
Editar: cita de la URL anterior para satisfacer la solicitud en el primer comentario ...
"UnicodeEncodeError: ''latin-1'' códec no puede codificar el carácter ..."
Esto se debe a que MySQLdb normalmente trata de codificar everythin a latin-1. Esto puede solucionarse ejecutando los siguientes comandos justo después de establecer la conexión:
db.set_character_set(''utf8'')
dbc.execute(''SET NAMES utf8;'')
dbc.execute(''SET CHARACTER SET utf8;'')
dbc.execute(''SET character_set_connection=utf8;'')
"db" es el resultado de
MySQLdb.connect()
, y "dbc" es el resultado dedb.cursor()
.
Python: Necesitará agregar # - * - codificación: UTF-8 - * - (elimine los espacios alrededor de *) a la primera línea del archivo python. y luego agregue lo siguiente al texto para codificar: .encode (''ascii'', ''xmlcharrefreplace'') . Esto reemplazará todos los caracteres Unicode con su equivalente ASCII.