tag mp3tag kid3 editar easytag python unicode encoding utf-8

mp3tag - python que codifica utf-8



mp3 tag linux (2)

Desafortunadamente, el método string.encode () no siempre es confiable. Echa un vistazo a este hilo para más información: ¿Cuál es la forma infalible de convertir una cadena (utf-8 o más) en una cadena ASCII simple en python

Estoy haciendo algunos guiones en Python. Creo una cadena que guardo en un archivo. Esta cadena recibió muchos datos, provenientes de la arborescencia y nombres de archivo de un directorio. Según convmv, toda mi arborescencia está en UTF-8.

Quiero mantener todo en UTF-8 porque luego lo guardaré en MySQL. Por ahora, en MySQL, que está en UTF-8, tuve algunos problemas con algunos personajes (como é o è - soy francés).

Quiero que Python siempre use cadena como UTF-8. Leí algunas informaciones en Internet y me gustó esto.

Mi script comienza con esto:

#!/usr/bin/python # -*- coding: utf-8 -*- def createIndex(): import codecs toUtf8=codecs.getencoder(''UTF8'') #lot of operations & building indexSTR the string who matter findex=open(''config/index/music_vibration_''+date+''.index'',''a'') findex.write(codecs.BOM_UTF8) findex.write(toUtf8(indexSTR)) #this bugs!

Y cuando ejecuto, aquí está la respuesta: UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xc3 in position 2171: ordinal not in range(128)

Editar: Veo, en mi archivo, el acento está muy bien escrito. Después de crear este archivo, lo leí y lo escribí en MySQL. Pero no entiendo por qué, pero tengo un problema con la codificación. Mi base de datos MySQL está en utf8, o parece ser una consulta SQL SHOW variables LIKE ''char%'' me devuelve solo utf8 o binario.

Mi función se ve así:

#!/usr/bin/python # -*- coding: utf-8 -*- def saveIndex(index,date): import MySQLdb as mdb import codecs sql = mdb.connect(''localhost'',''admin'',''*******'',''music_vibration'') sql.charset="utf8" findex=open(''config/index/''+index,''r'') lines=findex.readlines() for line in lines: if line.find(''#artiste'') != -1: artiste=line.split(''[:::]'') artiste=artiste[1].replace(''/n'','''') c=sql.cursor() c.execute(''SELECT COUNT(id) AS nbr FROM artistes WHERE nom="''+artiste+''"'') nbr=c.fetchone() if nbr[0]==0: c=sql.cursor() iArt+=1 c.execute(''INSERT INTO artistes(nom,status,path) VALUES("''+artiste+''",99,"''+artiste+''/")''.encode(''utf8'')

Y el artista que se muestra agradablemente en el archivo escribe mal en el BDD. Cuál es el problema ?


No necesita codificar datos que ya están codificados. Cuando trates de hacer eso, Python primero intentará decodificarlo a unicode antes de que pueda codificarlo de nuevo a UTF-8. Eso es lo que está fallando aquí:

>>> data = u''/u00c3'' # Unicode data >>> data = data.encode(''utf8'') # encoded to UTF-8 >>> data ''/xc3/x83'' >>> data.encode(''utf8'') # Try to *re*-encode it Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xc3 in position 0: ordinal not in range(128)

Simplemente escriba sus datos directamente en el archivo, no es necesario codificar los datos ya codificados.

Si, en cambio, crea valores unicode lugar, de hecho deberá codificarlos para que se puedan escribir en un archivo. En su lugar, querrá usar codecs.open() , que devuelve un objeto de archivo que codificará los valores Unicode para UTF-8 por usted.

También realmente no desea escribir la lista de materiales UTF-8, a menos que tenga que admitir herramientas de Microsoft que no pueden leer UTF-8 de lo contrario (como MS Notepad).

Para su problema de inserción de MySQL, debe hacer dos cosas:

  • Agregue charset=''utf8'' a su llamada MySQLdb.connect() .

  • Utilice objetos unicode , no objetos str cuando consulta o inserta, pero use parámetros sql para que el conector MySQL pueda hacer lo correcto para usted:

    artiste = artiste.decode(''utf8'') # it is already UTF8, decode to unicode c.execute(''SELECT COUNT(id) AS nbr FROM artistes WHERE nom=%s'', (artiste,)) # ... c.execute(''INSERT INTO artistes(nom,status,path) VALUES(%s, 99, %s)'', (artiste, artiste + u''/''))

En realidad, puede funcionar mejor si usó codecs.open() para decodificar los contenidos automáticamente en su lugar:

import codecs sql = mdb.connect(''localhost'',''admin'',''ugo&(-@F'',''music_vibration'', charset=''utf8'') with codecs.open(''config/index/''+index, ''r'', ''utf8'') as findex: for line in findex: if u''#artiste'' not in line: continue artiste=line.split(u''[:::]'')[1].strip() cursor = sql.cursor() cursor.execute(''SELECT COUNT(id) AS nbr FROM artistes WHERE nom=%s'', (artiste,)) if not cursor.fetchone()[0]: cursor = sql.cursor() cursor.execute(''INSERT INTO artistes(nom,status,path) VALUES(%s, 99, %s)'', (artiste, artiste + u''/'')) artists_inserted += 1

Es posible que desee repasar Unicode y UTF-8 y codificaciones. Puedo recomendar los siguientes artículos: