¿Cómo verifico si una cadena es Unicode o ASCII?

Resuelto TIMEX asked hace 13 años • 12 respuestas

¿Qué tengo que hacer en Python para saber qué codificación tiene una cadena?

TIMEX avatar Feb 14 '11 05:02 TIMEX
Aceptado

En Python 3, todas las cadenas son secuencias de caracteres Unicode. Hay un bytestipo que contiene bytes sin formato.

En Python 2, una cadena puede ser de tipo stro de tipo unicode. Puedes saber cuál usando un código como este:

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

Esto no distingue "Unicode o ASCII"; solo distingue los tipos de Python. Una cadena Unicode puede consistir únicamente en caracteres en el rango ASCII, y una cadena de bytes puede contener ASCII, Unicode codificado o incluso datos no textuales.

Greg Hewgill avatar Feb 13 '2011 22:02 Greg Hewgill

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

Puedes usar typeo 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, stres solo una secuencia de bytes. Python no sabe cuál es su codificación. El unicodetipo es la forma más segura de almacenar texto. Si quieres entender esto más, te 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, stres como el de Python 2 unicodey se usa para almacenar texto. Lo que se llamaba stren Python 2 se llama bytesen Python 3.


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

Puedes llamar decode. Si genera una excepción UnicodeDecodeError, 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)
Mikel avatar Feb 13 '2011 22:02 Mikel

En Python 3.x todas las cadenas son secuencias de caracteres Unicode. y hacer la verificación de instancia 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 la gente parece estar usando una declaración if que tiene dos comprobaciones. uno para str y otro para unicode.

Sin embargo, si desea verificar si tiene un objeto 'similar a una cadena' con una sola declaración, puede hacer lo siguiente:

isinstance(x, basestring)
ThinkBonobo avatar Sep 09 '2013 20:09 ThinkBonobo