¿Qué tengo que hacer en Python para averiguar que codifica una cadena tiene?

InformationsquelleAutor TIMEX | 2011-02-13

10 Comentarios

  1. 272

    En Python 3, todas las cadenas son secuencias de caracteres Unicode. Hay un bytes tipo que tiene crudo bytes.

    En Python 2, una cadena puede ser de tipo str o de tipo unicode. Se puede decir que el uso de código algo como esto:

    def whatisthis(s):
        if isinstance(s, str):
            print "ordinary string"
        elif isinstance(s, unicode):
            print "unicode string"
        else:
            print "not a string"

    Esto no distinguir «Unicode o ASCII»; sólo se distingue de Python tipos. Una cadena Unicode puede consistir meramente caracteres en el rango ASCII, y una bytestring puede contener caracteres ASCII, Unicode codificados, o incluso la no-textual de los datos.

    • Puedo obtener: NameError: name ‘unicode’ no está definido
    • Probablemente usted está usando Python 3.
  2. 111

    Cómo saber si un objeto es una cadena unicode o una cadena de bytes

    Puede utilizar type o isinstance.

    En Python 2:

    >>> type(u'abc')  # Python 2 unicode string literal
    <type 'unicode'>
    >>> type('abc')   # Python 2 byte string literal
    <type 'str'>

    En Python 2, str es sólo una secuencia de bytes. Python no sabe lo que
    su codificación es. El unicode tipo es la manera más segura de almacenar texto.
    Si usted quiere entender más esto, recomiendo http://farmdev.com/talks/unicode/.

    En Python 3:

    >>> type('abc')   # Python 3 unicode string literal
    <class 'str'>
    >>> type(b'abc')  # Python 3 byte string literal
    <class 'bytes'>

    En Python 3, str es como Python 2 unicode, y se utiliza para
    tienda de texto. Lo que se llamó str en Python 2 se llama bytes en Python 3.


    Cómo saber si una cadena de bytes es válido utf-8 o ascii

    Puede llamar decode. Si se plantea una UnicodeDecodeError excepción, no era válido.

    >>> u_umlaut = b'\xc3\x9c'   # UTF-8 representation of the letter 'Ü'
    >>> u_umlaut.decode('utf-8')
    u'\xdc'
    >>> u_umlaut.decode('ascii')
    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)
    • Sólo para los de otras personas de referencia – str.decodificar no no existen en python 3. Parece ser que tiene a unicode(s, "ascii") o algo
    • no existe
    • Lo siento, me refería str(s, "ascii")
    • Esta información no es precisa para python 3
    • Actualizado para cubrir Python 3. Y para tratar de explicar la diferencia entre bytestrings y cadenas unicode.
  3. 43

    En python 3.x todas las cadenas son secuencias de caracteres Unicode. y haciendo el isinstance de verificación para str (que significa cadena unicode de forma predeterminada) debería ser suficiente.

    isinstance(x, str)

    Con respecto a python 2.x,
    La mayoría de las personas parecen estar utilizando una instrucción if que tiene dos cheques. uno de str y uno para unicode.

    Si quieres comprobar si tienes una ‘cadena’ de objetos de todo con una sola instrucción, sin embargo, usted puede hacer lo siguiente:

    isinstance(x, basestring)
    • Esto es falso. En Python 2.7 isinstance(u"x",basestring) devuelve True.
    • Creo que era el punto. El uso de isinstance(x, basestring) es suficiente para reemplazar las distintas doble pruebas anteriores.
    • No, pero isinstance(x, basestring) es Cierto tanto para unicode y regular las cadenas, haciendo la prueba inútil.
    • Es útil en muchos casos, pero, evidentemente, no lo que la persona quiere decir.
    • Esta es la respuesta a la pregunta. Todos los demás entendido mal lo que el OP dijo y dio respuestas genéricas acerca de la comprobación de tipos en Python.
    • No contesta OP pregunta. El título de la pregunta (solo) PODRÍA interpretarse que esta respuesta es correcta. Sin embargo, OP específicamente dice: «figura que» en la cuestión de la descripción, y esta respuesta no dirección.

  4. 31

    Unicode no es un sistema de codificación – para citar Kumar McMillan:

    Si ASCII, UTF-8, y otras cadenas de bytes son «texto» …

    …entonces Unicode es «text-ness»;

    es la forma abstracta de texto

    Tener una lectura de McMillan del Unicode En Python, Totalmente Desmitificado hablar de PyCon de 2008, que explica las cosas mucho mejor que la mayoría de las respuestas correspondientes en Stack Overflow.

    • Las diapositivas son probablemente la mejor introducción a Unicode que he encontrado hasta la fecha
  5. 22

    Si el código debe ser compatible con tanto Python 2 y Python 3, no se puede utilizar directamente cosas como isinstance(s,bytes) o isinstance(s,unicode) sin envoltura de ellos en cualquiera de try/except o una versión de python prueba, porque bytes no está definido en Python 2 y unicode no está definido en Python 3.

    Hay algunos feo soluciones. Una muy fea es comparar la nombre de la clase, en lugar de comparar el tipo de la misma. He aquí un ejemplo:

    # convert bytes (python 3) or unicode (python 2) to str
    if str(type(s)) == "<class 'bytes'>":
        # only possible in Python 3
        s = s.decode('ascii')  # or  s = str(s)[2:-1]
    elif str(type(s)) == "<type 'unicode'>":
        # only possible in Python 2
        s = str(s)

    Podría decirse que un poco menos feo solución es comprobar el número de la versión de Python, por ejemplo:

    if sys.version_info >= (3,0,0):
        # for Python 3
        if isinstance(s, bytes):
            s = s.decode('ascii')  # or  s = str(s)[2:-1]
    else:
        # for Python 2
        if isinstance(s, unicode):
            s = str(s)

    Esos son tanto unpythonic, y la mayoría del tiempo hay, probablemente, una mejor manera.

    • La mejor manera es, probablemente, el uso de six, y prueba contra six.binary_type y six.text_type
    • Usted puede utilizar tipo(s).__nombre__ a de la sonda de tipo de nombres.
    • No estoy muy seguro de que el caso de uso para que el bit de código, a menos que exista un error de lógica. Creo que debe haber un «no» en python 2 código. De lo contrario, se va a convertir todo a las cadenas unicode para Python 3 y al contrario para Python 2!
    • Sí, oligofren, que es lo que hace. El estándar interno son las cadenas de caracteres Unicode en Python 3 y ASCII en Python 2. De modo que los fragmentos de código de convertir el texto a la norma interna de tipo cadena (sea Unicode o ASCII).
  6. 10

    uso:

    import six
    if isinstance(obj, six.text_type)

    dentro de las seis de la biblioteca es representado como:

    if PY3:
        string_types = str,
    else:
        string_types = basestring,
    • debe ser if isinstance(obj, six.text_type) . Pero sí, esta es la omi la respuesta correcta.
    • No contesta OP pregunta. El título de la pregunta (solo) PODRÍA interpretarse que esta respuesta es correcta. Sin embargo, OP específicamente dice: «figura que» en la cuestión de la descripción, y esta respuesta no dirección.
  7. 4

    Tenga en cuenta que en Python 3, no es muy justo decir que cualquiera de:

    • strs son UTFx para cualquier x (por ejemplo. UTF8)

    • strs son Unicode

    • strs son colecciones ordenadas de caracteres Unicode

    Python str tipo es (normalmente) una secuencia de puntos de código Unicode, algunos de los cuales se asignan a los personajes.


    Incluso en Python 3, no es tan sencillo responder a esta pregunta como se podría imaginar.

    Una manera obvia de prueba para ASCII compatible con cadenas es por un intento de codificar:

    "Hello there!".encode("ascii")
    #>>> b'Hello there!'
    
    "Hello there... ☃!".encode("ascii")
    #>>> Traceback (most recent call last):
    #>>>   File "", line 4, in <module>
    #>>> UnicodeEncodeError: 'ascii' codec can't encode character '\u2603' in position 15: ordinal not in range(128)

    El error distingue los casos.

    En Python 3, incluso hay algunas cadenas que contienen no válido puntos de código Unicode:

    "Hello there!".encode("utf8")
    #>>> b'Hello there!'
    
    "\udcc3".encode("utf8")
    #>>> Traceback (most recent call last):
    #>>>   File "", line 19, in <module>
    #>>> UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 0: surrogates not allowed

    El mismo método para distinguir a ellos se va a utilizar.

    • Esta es la respuesta correcta para Python 3, en mi humilde opinión.
  8. 2

    Usted podría utilizar Universal De Codificación Detector De, pero ser conscientes de que se acaba de dar a mejor supongo, no la codificación real, ya que es imposible saber la codificación de una cadena «abc», por ejemplo. Usted necesita para obtener la codificación de la información en otros lugares, por ejemplo, el protocolo HTTP utiliza el encabezado de Tipo de Contenido para que.

  9. 2

    Esto puede ayudar a alguien más, comencé a cabo las pruebas para el tipo de cadena de la variable s, pero para mi aplicación, tenía más sentido para devolver simplemente s como utf-8. El proceso de llamada return_utf, entonces sabe lo que se está tratando y puede manejar la cadena de forma adecuada. El código no es virgen, pero tengo la intención de que sea la versión de Python agnóstico sin una versión de prueba o de la importación de seis. Por favor comente con mejoras en el código de ejemplo siguiente para ayudar a otras personas.

    def return_utf(s):
        if isinstance(s, str):
            return s.encode('utf-8')
        if isinstance(s, (int, float, complex)):
            return str(s).encode('utf-8')
        try:
            return s.encode('utf-8')
        except TypeError:
            try:
                return str(s).encode('utf-8')
            except AttributeError:
                return s
        except AttributeError:
            return s
        return s # assume it was already utf-8

Dejar respuesta

Please enter your comment!
Please enter your name here