db = MySQLdb.connect (host = "localhost", user = "root", passwd = "", db = "testdb", use_unicode = True, charset = "utf8")
KyungHoon Kim
wow, @KyungHoonKim ¡me salvaste la vida! ¡Arriba vas!
Florian Doyen
Respuestas:
66
El carácter U + 201C La comilla doble izquierda no está presente en la codificación Latin-1 (ISO-8859-1).
Que está presente en la página de códigos 1252 (Europa Occidental). Esta es una codificación específica de Windows que se basa en ISO-8859-1 pero que coloca 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 del navegador web molesto pero ahora estándar que si entrega sus páginas como ISO-8859-1, el navegador las tratará como cp1252 en su lugar. 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 sólo como un almacén de bytes, puede utilizar 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 deshaciéndose de los caracteres, pero realmente en este siglo debería utilizar UTF-8 tanto en su base de datos como en sus páginas. Esta codificación permite utilizar cualquier carácter. Idealmente, también debería decirle a MySQL que está utilizando cadenas UTF-8 (configurando la conexión de la base de datos y la intercalación en las columnas de cadenas), para que pueda realizar una comparación y clasificación sin distinción entre mayúsculas y minúsculas.
¿No es cp1252un superconjunto estricto de ISO-8859-1? Es decir, cuando los navegadores reciben una página ISO-8859-1, pueden representarla como si fuera CP1252 porque de 0x80-0x9Ftodos modos no habrá caracteres del rango .
MSalters
3
No, los bytes 0x80–0x9F tienen asignaciones reales en ISO-8859-1, que son anuladas por las adiciones de cp1252 por lo que no es un superconjunto. Se asignan exactamente a los caracteres Unicode U + 0080 – U + 009F, que son una selección de caracteres de control. Son caracteres de control que no se usan mucho, razón por la cual los navegadores se salieron con la suya, pero es molesto cuando intentas convertir una secuencia de bytes como Unicode.
Bobince el
La única vez que he visto caracteres en el rango U + 0080-U + 009F en un archivo codificado como ISO-8859-1 o UTF-8 fue el resultado de que un payaso concatenaba un montón de archivos, algunos de los cuales estaban codificados en cp850. y luego transcodificando el mensaje resultante de "latin1" a UTF-8. El borrador de la especificación HTML5 está considerando santificar ese comportamiento muy práctico del navegador (y un montón de casos similares) - vea whatwg.org/specs/web-apps/current-work/multipage/…
John Machin
94
Me encontré con este mismo problema al usar el módulo Python MySQLdb. Dado que MySQL le permitirá almacenar casi cualquier dato binario que desee en un campo de texto independientemente del conjunto de caracteres, encontré mi solución aquí:
Editar: Cita de la URL anterior para satisfacer la solicitud en el primer comentario ...
"UnicodeEncodeError: el códec 'latin-1' no puede codificar caracteres ..."
Esto se debe a que MySQLdb normalmente intenta codificar todo en latin-1. Esto se puede solucionar ejecutando los siguientes comandos justo después de haber establecido la conexión:
Se sugiere que la parte relevante de un elemento vinculado se proporcione en la respuesta. El enlace para lectura adicional es excelente, pero intente
incluir
@Fluffeh Y fue así.
CatShoes
1
Muchas gracias, funcionó como un encanto después de probar 1000 cosas más.
Juergen Riemer
2
Solo db.set_character_set ('utf8') debería resolver el problema
Pandurang Patil
21
La mejor solucion es
establecer el juego de caracteres de mysql en 'utf-8'
me gusta este comentario (agregar use_unicode=Truey charset="utf8")
db = MySQLdb.connect (host = "localhost", user = "root", passwd = "", db = "testdb", use_unicode = True, charset = "utf8") - KyungHoon Kim 13 de marzo de 14 a las 17:04
ver detalle:
classConnection(_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.
"""
Esta respuesta necesita más votos a favor. Esta es una solución limpia, que elimina la capa de aplicación de los gastos generales de codificación innecesarios.
viernes
¡Excelente! Esto es exactamente lo que estaba buscando
Está intentando almacenar un punto de código Unicode \u201cutilizando una codificación ISO-8859-1 / Latin-1que no puede describir ese punto de código. Es posible que deba modificar la base de datos para usar utf-8 y almacenar los datos de la cadena con una codificación adecuada, o puede que desee 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-1252pueden causar y sugiere cómo procesarlo, ¡además de enlaces al código de muestra!
Latin-1 codifica caracteres Unicode específicos , pero no ese. No importa si \ u201c no cabe en un byte. windows-1252 también es un esquema de codificación de un solo octeto, y no incluye \ u201c.
Mark Tolonen
cp1253 (también conocido como windows-1253) es también un esquema de codificación de caracteres de un solo octeto y, sin embargo, \u0391encaja bien en un byte (específicamente, el byte 193). Es posible que desee echar un vistazo a eso ; la gente lo ha encontrado útil.
tzot
Unicode incorpora glifos Latin-1 / cp1253 como puntos de código de 16 bits. Me sorprende que los comentarios parezcan afirmar lo contrario.
msw
-3
Python: deberá 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.
Respuestas:
El carácter U + 201C La comilla doble izquierda no está presente en la codificación Latin-1 (ISO-8859-1).
Que está presente en la página de códigos 1252 (Europa Occidental). Esta es una codificación específica de Windows que se basa en ISO-8859-1 pero que coloca 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 del navegador web molesto pero ahora estándar que si entrega sus páginas como ISO-8859-1, el navegador las tratará como cp1252 en su lugar. 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 sólo como un almacén de bytes, puede utilizar 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 deshaciéndose de los caracteres, pero realmente en este siglo debería utilizar UTF-8 tanto en su base de datos como en sus páginas. Esta codificación permite utilizar cualquier carácter. Idealmente, también debería decirle a MySQL que está utilizando cadenas UTF-8 (configurando la conexión de la base de datos y la intercalación en las columnas de cadenas), para que pueda realizar una comparación y clasificación sin distinción entre mayúsculas y minúsculas.fuente
cp1252un superconjunto estricto de ISO-8859-1? Es decir, cuando los navegadores reciben una página ISO-8859-1, pueden representarla como si fuera CP1252 porque de0x80-0x9Ftodos modos no habrá caracteres del rango .Me encontré con este mismo problema al usar el módulo Python MySQLdb. Dado que MySQL le permitirá almacenar casi cualquier dato binario que desee 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 ...
db.set_character_set('utf8') dbc.execute('SET NAMES utf8;') dbc.execute('SET CHARACTER SET utf8;') dbc.execute('SET character_set_connection=utf8;')fuente
La mejor solucion es
me gusta este comentario (agregar
use_unicode=Trueycharset="utf8")ver detalle:
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. """fuente
utf8mb4para mysql si tenemosemoji.etc, consulte cuál-es-la-diferencia-entre-utf8mb4-y-utf8-charsets-in-mysqlEspero que su base de datos sea al menos UTF-8. Entonces deberá ejecutarlo
yourstring.encode('utf-8')antes de intentar ponerlo en la base de datos.fuente
Está intentando almacenar un punto de código Unicode
\u201cutilizando una codificaciónISO-8859-1 / Latin-1que no puede describir ese punto de código. Es posible que deba modificar la base de datos para usar utf-8 y almacenar los datos de la cadena con una codificación adecuada, o puede que desee 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 quewindows-1252pueden causar y sugiere cómo procesarlo, ¡además de enlaces al código de muestra!fuente
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 en sí.
Docs
fuente
Utilice el siguiente fragmento para convertir el texto del latín al inglés
import unicodedata def strip_accents(text): return "".join(char for char in unicodedata.normalize('NFKD', text) if unicodedata.category(char) != 'Mn') strip_accents('áéíñóúü')salida:
fuente
Latin-1 (también conocido como ISO 8859-1 ) es un esquema de codificación de caracteres de un solo octeto, y no puede encajar
\u201c(“) en un byte.¿Quería utilizar la codificación UTF-8?
fuente
\u0391encaja bien en un byte (específicamente, el byte 193). Es posible que desee echar un vistazo a eso ; la gente lo ha encontrado útil.Python: deberá 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.
fuente