Convertir la cadena de bytes en la cadena Unicode

Tengo un código tal que:

a = "\u0432" b = u"\u0432" c = b"\u0432" d = c.decode('utf8') print(type(a), a) print(type(b), b) print(type(c), c) print(type(d), d) 

Y salida:

  в  в  b'\\u0432'  \u0432 

¿Por qué en este último caso veo un código de carácter, en lugar del carácter? ¿Cómo puedo transformar la cadena de bytes en una cadena de Unicode que en el caso de una salida vi el carácter, en lugar de su código?

En cadenas (u objetos Unicode en Python 2), \u tiene un significado especial, es decir, “aquí viene un carácter Unicode especificado por su ID de Unicode”. Por lo tanto, u"\u0432" dará como resultado el carácter в.

El prefijo b'' le dice que esto es una secuencia de bytes de 8 bits, y el objeto bytes no tiene caracteres Unicode, por lo que el código \u no tiene un significado especial. Por lo tanto, b"\u0432" es solo la secuencia de los bytes \ , u , 0 , 4 , 3 y 2 .

Esencialmente, tiene una cadena de 8 bits que no contiene un carácter Unicode, sino la especificación de un carácter Unicode.

Puede convertir esta especificación utilizando el codificador de escape Unicode.

 >>> c.decode('unicode_escape') 'в' 

Me encantó la respuesta de Lennart. Me puso en el camino correcto para resolver el problema particular al que me había enfrentado. Lo que agregué fue la capacidad de producir código compatible con html para \ u ???? Especificaciones en cuerdas. Básicamente, solo se necesitaba una línea:

 results = results.replace('\\u','&#x') 

Todo esto surgió de la necesidad de convertir los resultados JSON en algo que se muestre bien en un navegador. Aquí hay un código de prueba que está integrado con una aplicación en la nube:

 # References: # http://stackoverflow.com/questions/9746303/how-do-i-send-a-post-request-as-a-json # https://docs.python.org/3/library/http.client.html # http://docs.python-requests.org/en/v0.10.7/user/quickstart/#custom-headers # http://stackoverflow.com/questions/606191/convert-bytes-to-a-python-string # http://www.w3schools.com/charsets/ref_utf_punctuation.asp # http://stackoverflow.com/questions/13837848/converting-byte-string-in-unicode-string import urllib.request import json body = [ { "query": "co-development and language.name:English", "page": 1, "pageSize": 100 } ] myurl = "https://core.ac.uk:443/api-v2/articles/search?metadata=true&fulltext=false&citations=false&similar=false&duplicate=false&urls=true&extractedUrls=false&faithfulMetadata=false&apiKey=SZYoqzk0Vx5QiEATgBPw1b842uypeXUv" req = urllib.request.Request(myurl) req.add_header('Content-Type', 'application/json; charset=utf-8') jsondata = json.dumps(body) jsondatabytes = jsondata.encode('utf-8') # needs to be bytes req.add_header('Content-Length', len(jsondatabytes)) print ('\n', jsondatabytes, '\n') response = urllib.request.urlopen(req, jsondatabytes) results = response.read() results = results.decode('utf-8') results = results.replace('\\u','&#x') # produces html hex version of \u???? unicode characters print(results)