¿Cuál es el prefijo u en una cadena de Python?


232

Como en:

u'Hello'

Mi conjetura es que indica "Unicode", ¿es correcto?

Si es así, ¿desde cuándo está disponible?

Respuestas:


147

Tienes razón, ver 3.1.3. Cuerdas Unicode .

Ha sido la sintaxis desde Python 2.0.

Python 3 los hizo redundantes, ya que el tipo de cadena predeterminado es Unicode. Las versiones 3.0 a 3.2 las eliminaron, pero se volvieron a agregar en 3.3+ para compatibilidad con Python 2 para ayudar en la transición de 2 a 3.


66
Hay que agregar que ya no es necesario en Python 3, pero sigue siendo una sintaxis válida.
Martin Thoma

La combinación de cadenas unicode + raw (regex) (p ur"string". Ej. ) Es válida en Python 2, pero desafortunadamente es una sintaxis no válida en Python 3.
cowlinator

123

La u en u'Some String'significa que su cadena es una cadena Unicode .

P: Estoy muy apurado y aterricé aquí desde Google Search. Estoy tratando de escribir estos datos en un archivo, obtengo un error y necesito la solución más simple, probablemente defectuosa, en este momento.

R: Realmente deberías leer el ensayo Absoluto Mínimo de Joel que todo desarrollador de software debe saber absolutamente, positivamente sobre el ensayo Unicode y los conjuntos de caracteres (¡Sin excusas!) Sobre conjuntos de caracteres.

Q: sry sin código de tiempo por favor

Una multa. intente str('Some String')o 'Some String'.encode('ascii', 'ignore'). Pero realmente debería leer algunas de las respuestas y la discusión sobre la conversión de una cadena Unicode y este excelente, excelente, manual sobre codificación de caracteres.


66
Esto funciona si la cadena contiene solo texto ASCII . En todos los demás casos, tendrá que codificar explícitamente.
Martijn Pieters

2
Esto trata a la u '' como algo de "deshacerse". Esto me dice que realmente no entiendes lo que es. Por lo general, no solo desea "deshacerse de él", y la forma correcta de hacer una cadena de bytes a partir de una cadena Unicode depende de lo que contenga esa cadena y en qué contexto.
Lennart Regebro

2
@LennartRegebro estuvo totalmente de acuerdo: esta fue una respuesta desechable que estaba destinada a ser irónica, pero acumuló una especie de horrible número de votos a favor. editado para tratar de dirigir a la gente en la dirección correcta.
Andrew

1
¡Esa fue una lectura divertida! ¡Gracias! El artículo tiene 17 años y aún es exacto. Guau.
Kerwin Sneijders

52

Mi conjetura es que indica "Unicode", ¿es correcto?

Si.

Si es así, ¿desde cuándo está disponible?

Python 2.x.

En Python 3.x las cadenas usan Unicode por defecto y no hay necesidad del uprefijo. Nota: en Python 3.0-3.2, la u es un error de sintaxis. En Python 3.3+ es legal nuevamente para que sea más fácil escribir aplicaciones compatibles con 2/3.


44
Incluso es un error de sintaxis en Python 3 usar el uprefijo.
Tim Pietzcker

14
@TimPietzcker: solo en 3.0-3.2; en 3.3+ es legal (y sin sentido), para facilitar la escritura de bibliotecas y aplicaciones de base de código único 2.6 + / 3.3 +.
abarnert

@abarnert: Bueno, ese comentario tiene ahora cuatro años y medio :)
Tim Pietzcker

3
@TimPietzcker: Claro, pero así como su comentario fue un apéndice útil para cualquiera que encuentre esta respuesta útil mediante la búsqueda en 2010, creo que es útil mencionar el cambio en 3.3 a cualquiera que lo encuentre en 2014. Podría decirse que sería mejor editar el respondo, pero creo que es un punto menor con el que la mayoría de las personas no se encontrarán (porque a menos que sigas usando 3.0-3.2 en 2014, "no es necesario el prefijo" es todo lo que necesitas saber).
abarnert

Si está escribiendo código para que usuarios arbitrarios lo descarguen y ejecuten, y desea cubrir la mayoría de los casos posibles sin hacer suposiciones, es útil saber que 3.0-3.2 se romperá. Porque debe decidir si desea usarlo en six.text_type()todas partes para el número (con suerte minúsculo) de personas que todavía usan 3. [012] - Al menos la información está ahí para que pueda elegir.
dwanderson

3

Vine aquí porque tenía el síndrome del charco gracioso en mi requestssalida. Pensé response.textque me daría una cadena decodificada correctamente, pero en la salida encontré divertidos caracteres dobles donde deberían haber sido las diéresis alemanas.

Resulta que de response.encodingalguna manera estaba vacío, por responselo que no sabía cómo decodificar correctamente el contenido y simplemente lo trató como ASCII (supongo).

Mi solución fue obtener los bytes sin formato con 'response.content' y aplicarlos manualmente decode('utf_8'). El resultado fue schöne Umlaute.

El decodificado correctamente

pelaje

contra los decodificados incorrectamente

fĂźr


2

Todas las cadenas destinadas a humanos deberían usar u "".

Descubrí que la siguiente mentalidad ayuda mucho cuando se trata de cadenas de Python: Todas las cadenas de manifiesto de Python deben usar la u""sintaxis. La ""sintaxis es solo para conjuntos de bytes.

Antes de que comience el ataque, déjame explicarte. La mayoría de los programas de Python comienzan con el uso ""de cadenas. Pero luego deben admitir la documentación fuera de Internet, por lo que comienzan a usar "".decodey, de repente, reciben excepciones en todas partes sobre la decodificación de esto y aquello, todo por el uso de ""cadenas. En este caso, Unicode actúa como un virus y causará estragos.

Pero, si sigue mi regla, no tendrá esta infección (porque ya estará infectado).


bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
kennytm

@KennyTM ¡Suena bien! Simplemente pretende decir que todas las cadenas destinadas a los humanos deberían usar u"".
Frank Krueger

1
Si quiere usar Unicode religiosamente en todas partes, lo cual, para muchas aplicaciones (pero no todas), es algo bueno, es casi seguro que quiere Python 3.x, no 2.x. Eso puede no haber sido cierto en 2010 cuando se escribió esto, pero en 2014, la mayoría de las bibliotecas o plataformas que le impiden actualizar a 3.x también le impedirá usar Unicode correctamente ...
abarnert

1

Es unicode.

Simplemente ponga la variable entre str(), y funcionará bien.

Pero en caso de que tenga dos listas como las siguientes:

a = ['co32','co36']
b = [u'co32',u'co36']

Si marca set(a)==set(b), será falso, pero si hace lo siguiente:

b = str(b)
set(a)==set(b)

Ahora, el resultado será verdadero.


Peligro PELIGRO. Nunca debe codificar un Unicode ( str()o u'€'.encode()) sin pasar una codificación. Si la cadena contiene no ASCII, el usuario recibirá una excepción UnicodeEncodeException.
Alastair McCormack

3
Además, tu código no funciona. b = str(b)solo da la cadena repr()de la lista, es decir b = "[u'co32', u'co36']". Entoncesset(a)==set(b) = False
Alastair McCormack
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.