Я пытаюсь загрузить двоичный файл, используя 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
Есть ли известный трюк, чтобы обойти эти проблемы с кодировкой при попытке воссоздания файла? Как бы вы достигли этого самостоятельно?
Любая помощь или подсказку очень ценится :)