Conversión de utf-16 a utf-8 en Python 3

Estoy progtwigndo en Python 3 y tengo un pequeño problema que no puedo encontrar ninguna referencia a él en la red.

Por lo que entiendo, la cadena predeterminada es utf-16, pero debo trabajar con utf-8, no puedo encontrar el comando que se convertirá del predeterminado a utf-8. Apreciaría mucho tu ayuda.

En Python 3 hay dos tipos de datos diferentes importantes cuando se trabaja con la manipulación de cadenas. Primero está la clase de cadena, un objeto que representa puntos de código Unicode. Es importante obtener que esta cadena no sea algunos bytes, sino realmente una secuencia de caracteres. En segundo lugar, está la clase de bytes, que es solo una secuencia de bytes, que a menudo representa una cadena almacenada en una encoding (como utf-8 o iso-8859-15).

¿Qué significa esto para ti? Por lo que tengo entendido, usted quiere leer y escribir archivos utf-8. Hagamos un progtwig que reemplace todos los caracteres ‘ć’ con ‘ç’

def main(): # Let's first open an output file. See how we give an encoding to let python know, that when we print something to the file, it should be encoded as utf-8 with open('output_file', 'w', encoding='utf-8') as out_file: # read every line. We give open() the encoding so it will return a Unicode string. for line in open('input_file', encoding='utf-8'): #Replace the characters we want. When you define a string in python it also is automatically a unicode string. No worries about encoding there. Because we opened the file with the utf-8 encoding, the print statement will encode the whole string to utf-8. print(line.replace('ć', 'ç'), out_file) 

Entonces, ¿cuándo deberías usar bytes? No a menudo. Un ejemplo en el que podría pensar sería cuando lees algo desde un socket. Si tiene esto en un objeto de bytes, puede convertirlo en una cadena Unicode haciendo bytes.decode (‘encoding’) y viceversa con str.encode (‘encoding’). Pero como dije, probablemente no lo necesites.

Aún así, porque es interesante, aquí de manera difícil, donde codificas todo por ti mismo:

 def main(): # Open the file in binary mode. So we are going to write bytes to it instead of strings with open('output_file', 'wb') as out_file: # read every line. Again, we open it binary, so we get bytes for line_bytes in open('input_file', 'rb'): #Convert the bytes to a string line_string = bytes.decode('utf-8') #Replace the characters we want. line_string = line_string.replace('ć', 'ç') #Make a bytes to print out_bytes = line_string.encode('utf-8') #Print the bytes print(out_bytes, out_file) 

Una buena lectura sobre este tema (codificaciones de cadenas) es http://www.joelonsoftware.com/articles/Unicode.html . Realmente recomiendo leer!

Fuente: http://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(PS Como ve, no mencioné utf-16 en esta publicación. En realidad no sé si Python usa esto como deencoding interna o no, pero es totalmente irrelevante. En el momento en que está trabajando con una cadena, trabajas con caracteres (puntos de código), no con bytes.