Получение содержимого двоичного файла с помощью JavaScript, Base64 кодируют его и обратный декодируют его, используя Python

Я пытаюсь загрузить двоичный файл, используя XMLHTTPREQUEST (с использованием недавнего WebKit) и Base64-кодирования его содержимого, используя это Простая функция:

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

Как побочная записка, все выше, является стандартным штуком JavaScript, в том числе BTOA () и и encodeUricomponent () : https: //developer.mozilla. org / ru / dom / window.BTOA

Это работает довольно гладко, и я могу даже декодировать содержимое Base64 с помощью JavaScript:

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

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

Теперь я хочу декодировать содержимое в кодировке Base64 с помощью Python, который потребляет некоторую строку JSON Получите base64encoded значение строки . Наивно это то, что я делаю:

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

, но результирующий файл недействителен, выглядит Подобно операции Messaed с UTF-8, кодированием или чем-то, что все еще неясно для меня.

Если я попытаюсь расширить содержимое UTF-8, прежде чем поместить их в пункт назначения, возникает ошибка:

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)

в качестве побочной записи, вот скриншот двух текстовых представлений одинакового файла; Слева: оригинал; Справа: тот, который создан из строки Base64-декодированной: http://cl.ly/0u3g34110z3c132o2e2x

Есть ли известный трюк, чтобы обойти эти проблемы с кодировкой при попытке воссоздания файла? Как бы вы достигли этого самостоятельно?

Любая помощь или подсказку очень ценится :)

37
задан NiKo 10 September 2011 в 11:37
поделиться