Sé que hay un montón de hilos sobre este tema pero no he conseguido encontrar uno que soluciona mi problema.

Que estoy tratando de imprimir una cadena, pero cuando se imprimen no muestra los caracteres especiales (por ejemplo, æ, ø, å, ö y ü). Al imprimir la cadena mediante repr() esto es lo que obtengo:

u'Von D\xc3\xbc' y u'\xc3\x96berg'

¿Alguien sabe cómo puedo convertir esto en Von Dü y Öberg? Para mí es importante que estos personajes no son ignorados, por ejemplo,myStr.encode("ascii", "ignore").

EDITAR

Este es el código que uso. Yo uso BeautifulSoup para raspar un sitio web. El contenido de una celda (<td>) en una tabla (<table>), se pone en la variable name. Esta es la variable que contiene caracteres especiales que no puedo imprimir.

web = urllib2.urlopen(url);
soup = BeautifulSoup(web)
tables = soup.find_all("table")
scene_tables = [2, 3, 6, 7, 10]
scene_index = 0
# Iterate over the <table>s we want to work with
for scene_table in scene_tables:
    i = 0
    # Iterate over < td> to find time and name
    for td in tables[scene_table].find_all("td"):
        if i % 2 == 0:  # td contains the time
            time = remove_whitespace(td.get_text())
        else:           # td contains the name
            name = remove_whitespace(td.get_text()) # This is the variable containing "nonsense"
            print "%s: %s" % (time, name,)
        i += 1
    scene_index += 1
  • Es su conjunto de consola en modo UTF-8?
  • Estoy usando el terminal por defecto en Mac OS X y UTF-8 está habilitado.
InformationsquelleAutor simonbs | 2012-04-02

3 Comentarios

  1. 7

    La prevención es mejor que curar. Lo que necesitas es averiguar cómo que la basura está siendo creado. Por favor, edita tu pregunta para mostrar el código que lo crea y, a continuación, nos puede ayudar a solucionarlo. Parece que alguien ha hecho:

    your_unicode_string =  original_utf8_encoded_bytestring.decode('latin1')

    La cura es la de invertir el proceso, simplemente, y luego decodificar.

    correct_unicode_string = your_unicode_string.encode('latin1').decode('utf8')

    Actualización Basado en el código proporcionado, la causa probable es que el sitio web declara que está codificada en ISO-8859-1 (aka latin1) pero en realidad se está codificado en UTF-8. Por favor, actualice su pregunta que nos muestre la url.

    Si usted no puede mostrar, leer el BS docs; parece que usted necesitará utilizar:

    BeautifulSoup(web, from_encoding='utf8')
    • He actualizado mi pregunta para mostrar el código que uso. Yo uso BeautifulSoup para raspar un sitio web. A continuación, el contenido de una celda en una tabla, se produce en la variable name. Esta es la variable que contiene caracteres especiales que no puedo imprimir.
    • El uso de name.encode('latin1').decode('utf8') resuelve todos mis problemas. Los personajes se ve perfecta, pero dicen que esto no es la manera correcta de hacerlo?
    • Re-leer la primera frase de mi respuesta. Siempre es mejor entiendo su verdadero problema y solucionarlo en la fuente, no abajo. Que codificar/decodificar es simplemente revertir el problema subyacente.
    • BeautifulSoup(web, from_encoding='utf8') hizo el truco. Muchas gracias!
  2. 3

    Soporte Unicode en muchos idiomas es confuso, por lo que su error aquí es comprensible. Esas son las cadenas de caracteres UTF-8 bytes, que pueda funcionar correctamente si se le cae la u en el frente:

    >>> err = u'\xc3\x96berg'
    >>> print err
    Ã?berg
    >>> x = '\xc3\x96berg'
    >>> print x
    Öberg
    >>> u = x.decode('utf-8')
    >>> u
    u'\xd6berg'
    >>> print u
    Öberg

    Para las porciones más información:

    http://www.joelonsoftware.com/articles/Unicode.html

    http://docs.python.org/howto/unicode.html


    Usted debe realmente leer los enlaces y entender lo que está pasando antes de continuar. Si, sin embargo, es absolutamente necesario tener algo que funciona hoy en día, usted puede utilizar esta horrible hack que estoy avergonzado de publicar públicamente:

    def convert_fake_unicode_to_real_unicode(string):
        return ''.join(map(chr, map(ord, string))).decode('utf-8')
    • Cuando puedo imprimir las cuerdas sin repr(), esto es lo que obtengo: Ãberg pero lo que me gustaría tener es Öberg. Si yo uso decode('utf-8'), voy a conseguir un UnicodeEncodeError. Si las cadenas son UTF-8, no debería escribir un Ö en lugar de Ã?
    • Usted querrá averiguar cómo esas variables tiene que ser de tipo unicode en el primer lugar. De hecho, están codificados en UTF-8 en ascii, por lo que debería de tipo str.
    • -1 de (1) la combinación/mapa/chr/mapa/ord lío (2) «UTF-8 codificados en ascii»
  3. 1

    El contenido de las cadenas no son unicode, que están codificados en UTF-8.

    >>> print u'Von D\xc3\xbc'
    Von Dü
    >>> print 'Von D\xc3\xbc'
    Von Dü
    
    >>> print unicode('Von D\xc3\xbc', 'utf-8')
    Von Dü
    >>> 

    Edición:

    >>> print '\xc3\x96berg' # no unicode identifier, works as expected because it's an UTF-8 encoded string
    Öberg
    >>> print u'\xc3\x96berg' # has unicode identifier, means print uses the unicode charset now, outputs weird stuff
    Ãberg
    
    # Look at the differing object types:
    >>> type('\xc3\x96berg')
    <type 'str'>
    >>> type(u'\xc3\x96berg')
    <type 'unicode'>
    
    >>> '\xc3\x96berg'.decode('utf-8') # this command converts from UTF-8 to unicode, look at the unicode identifier in the output
    u'\xd6berg'
    >>> unicode('\xc3\x96berg', 'utf-8') # this does the same thing
    u'\xd6berg'
    >>> unicode(u'foo bar', 'utf-8') # trying to convert a unicode string to unicode will fail as expected
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: decoding Unicode is not supported
    • Cuando puedo imprimir las cuerdas sin repr(), esto es lo que obtengo: Ãberg pero lo que me gustaría tener es Öberg. Si las cadenas son UTF-8, no debería escribir un Ö en lugar de Ã? Si yo uso unicode, me sale el siguiente error: TypeError: decoding Unicode is not supported.
    • Usted todavía utiliza el identificador de unicode (u'foo'). Es una codificación UTF-8, cadena y mediante el identificador de unicode, te dicen que es unicode donde no hay. Es por eso que se à en lugar de Ö. Colocar el identificador y vas a estar bien. Voy a actualizar mi respuesta para que quede claro.
    • He actualizado mi respuesta. Usted debe leer este enlace: docs.python.org/howto/unicode.html
    • Acabo de leer el enlace. Todavía estoy un poco confundido, sin embargo. Tengo mi cadena, myStr, que es de tipo unicode, lo que significa que tiene el identificador de unicode. Quiero eliminar este identificador y tienen una codificación UTF-8 de la cadena. ¿Cómo puedo hacer esto? Yo había pensado que sería sencilla como myStr.encode("utf-8") que devuelve un objeto de tipo str pero esto arroja una UnicodeDecodeError de error.
    • Que deben trabajar. Puedes publicar ese ejemplo en la pregunta o en pastebin.com ?
    • -1 «Esas son las cadenas de caracteres no unicode» — repr(those_strings) tiene un u de la parte frontal; SON unicode, son fallido de unicode. Él tiene DATOS, no de código fuente literales. El u es puesto allí por repr(); él no puede «soltar el identificador».
    • Verdadero. La propia cadena de unicode, pero el contenido no lo es. Por «colocar el identificador» me refería a que no debe de tratar a la cadena como unicode, porque el texto es UTF-8. He actualizado mi respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here