Recuperando o conteúdo do arquivo binário usando Javascript, base64 codifica-o e decodifique-o reversamente usando Python

Estou tentando baixar um arquivo binário usandoXMLHttpRequest (usando um Webkit recente) e codifique base64 seu conteúdo usando esta função simples:

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);

Como observação, tudo o que está descrito acima é material Javascript padrão, incluindobtoa() eencodeURIComponent(): https: //developer.mozilla.org/en/DOM/window.bto

Isso funciona muito bem, e posso até decodificar o conteúdo da base64 usando Javascript:

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

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

gora, eu quero decodificar o conteúdo codificado em base64 usando Python, que consome alguma string JSON para obter obase64encoded valor da string. Ingenuamente é isso que eu faço:

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()

Mas o arquivo resultante é inválido, parece que a operação foi alterada com UTF-8, codificação ou algo que ainda não está claro para mim.

Se eu tentar decodificar o conteúdo UTF-8 antes de colocá-lo no arquivo de destino, ocorrerá um erro:

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 observação, aqui está uma captura de tela de duas representações textuais de um mesmo arquivo; à esquerda: o original; à direita: o criado a partir da string decodificada em base64:http: //cl.ly/0U3G34110z3c132O2e2

Existe um truque conhecido para contornar esses problemas com a codificação ao tentar recriar o arquivo? Como você conseguiria isso sozinho?

Qualquer ajuda ou dica muito apreciada

questionAnswers(1)

yourAnswerToTheQuestion