Recuperar contenido de archivos binarios usando Javascript, codificarlo en base64 y decodificarlo en reversa usando Python

Estoy intentando descargar un archivo binario usandoXMLHttpRequest (usando un Webkit reciente) y codifique base64 sus contenidos usando esta función simple:

function getBinary(file){
    var xhr = new XMLHttpRequest();  
    xhr.open("GET", file, false);  
    xhr.overrideMimeType("text/plain; charset=x-user-defined");  
    xhr.send(null);
    return xhr.responseText;
}

function base64encode(binary) {
    return btoa(unescape(encodeURIComponent(binary)));
}

var binary = getBinary('http://some.tld/sample.pdf');
var base64encoded = base64encode(binary);

omo nota al margen, todo lo anterior es material estándar de Javascript, incluidobtoa() yencodeURIComponent(): https: //developer.mozilla.org/en/DOM/window.bto

Esto funciona bastante bien, e incluso puedo decodificar los contenidos de base64 usando Javascript:

function base64decode(base64) {
    return decodeURIComponent(escape(atob(base64)));
}

var decodedBinary = base64decode(base64encoded);
decodedBinary === binary // true

Ahora, quiero decodificar los contenidos codificados en base64 usando Python que consume alguna cadena JSON para obtener elbase64encoded valor de cadena. Ingenuamente, esto es lo que hago:

import urllib
import base64
# ... retrieving of base64 encoded string through JSON
base64 = "77+9UE5HDQ……………oaCgA="
source_contents = urllib.unquote(base64.b64decode(base64))
destination_file = open(destination, 'wb')
destination_file.write(source_contents)
destination_file.close()

Pero el archivo resultante no es válido, parece que la operación está desordenada con UTF-8, codificación o algo que todavía no está claro para mí.

Si intento decodificar los contenidos de UTF-8 antes de ponerlos en el archivo de destino, se genera un error:

import urllib
import base64
# ... retrieving of base64 encoded string through JSON
base64 = "77+9UE5HDQ……………oaCgA="
source_contents = urllib.unquote(base64.b64decode(base64)).decode('utf-8')
destination_file = open(destination, 'wb')
destination_file.write(source_contents)
destination_file.close()

$ python test.py
// ...
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 0: ordinal not in range(128)

Como nota al margen, aquí hay una captura de pantalla de dos representaciones textuales de un mismo archivo; a la izquierda: el original; a la derecha: el creado a partir de la cadena decodificada en base64:http: //cl.ly/0U3G34110z3c132O2e2

¿Existe algún truco conocido para evitar estos problemas con la codificación al intentar recrear el archivo? ¿Cómo lo lograrías tú mismo?

Cualquier ayuda o sugerencia muy apreciada:)

Respuestas a la pregunta(1)

Su respuesta a la pregunta