2010-02-01 8 views

Respuesta

10

La respuesta correcta es:

p.communicate(b"insert into egg values ('egg');"); 

Nota el principal B, que le dice que es una cadena de bytes, no es una cadena de caracteres unicode Además, si usted está leyendo esto desde un archivo:

value = open('thefile', 'rt').read() 
p.communicate(value); 

El cambio que a:

value = open('thefile', 'rb').read() 
p.communicate(value); 

Una vez más, tenga en cuenta la 'b'. Ahora, si su value es una cadena que obtiene de una API que solo devuelve cadenas sin importar qué, , luego, necesita codificarla.

p.communicate(value.encode('latin-1'); 

Latin-1, porque a diferencia de ASCII es compatible con todos los 256 bytes. Pero dicho esto, tener datos binarios en Unicode es pedir problemas. Es mejor si puedes hacerlo binario desde el principio.

5

se puede convertir a bytes con encode método:

>>> "insert into egg values ('egg');".encode('ascii') # ascii is just an example 
b"insert into egg values ('egg');" 
+0

Una extensión de la respuesta: en Python 3 todas las cadenas son Unicode, y probablemente necesiten una codificación mientras se transfieren a la aplicación para que la aplicación lo entienda. Para eso es el ascii. – extraneon

+2

@extraneon: Sí, todas las cadenas son unicode en Python 3. Por eso no usa cadenas para contener datos que se supone que se transferirán, usted usa bytes. La codificación es, por lo tanto, en gran medida innecesaria, si mantiene los datos en el formato correcto desde el principio. –

Cuestiones relacionadas