¿Cómo verifico si una cadena es Unicode o ASCII?
¿Qué tengo que hacer en Python para saber qué codificación tiene una cadena?
En Python 3, todas las cadenas son secuencias de caracteres Unicode. Hay un bytes
tipo que contiene bytes sin formato.
En Python 2, una cadena puede ser de tipo str
o 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.
Cómo saber si un objeto es una cadena Unicode o una cadena de bytes
Puedes usar 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 solo una secuencia de bytes. Python no sabe cuál es su codificación. El unicode
tipo 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, str
es como el de Python 2 unicode
y se usa para almacenar texto. Lo que se llamaba str
en Python 2 se llama bytes
en 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)
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)