URL: https://linuxfr.org/users/aboulle/journaux/jupyter-et-la-gestion-des-caracteres-de-fin-de-ligne-dans-les-url-de-donnees-par-firefox-vs-chromium
Title: Jupyter et la gestion des caractères de fin de ligne dans les URL de données par Firefox vs Chromium
Authors: aboulle
Date: 2019-09-19T18:45:47+02:00
License: CC By-SA
Tags: python, jupyter, firefox, chromium et url
Score: 12
Cher journal,
n'étant pas développeur web ce qui suit est peut-être largement connu ; aussi excuse-moi si j'enfonce des portes ouvertes.
J'ai constaté un comportement étrange de Firefox concernant la gestion des caractères de fin de ligne/nouvelle ligne (\n) lorsque ceux-ci sont inclus dans des [URL de données](https://developer.mozilla.org/fr/docs/Web/HTTP/Basics_of_HTTP/Data_URIs). Pour le contexte, il peut arriver, lorsqu'on travaille sur des serveurs Jupyter distants, que l'utilisateur n'ait pas accès à l'espace de fichier où sont stockés les notebooks. Dans ce cas, un des moyens dont dispose le développeur desdits notebooks pour permettre aux utilisateurs de récupérer les données issues de calculs effectués sur le serveur, est de les inclure directement dans une URL de données. Voir cette [discussion](https://stackoverflow.com/questions/31893930/download-csv-from-an-ipython-notebook/36328021#36328021) ou ce [billet](https://medium.com/ibm-data-science-experience/how-to-upload-download-files-to-from-notebook-in-my-local-machine-6a4e65a15767) par exemple (il parait que cela pose des [problèmes de sécurité](https://en.wikipedia.org/wiki/Data_URI_scheme#Malware_and_phishing) mais ceci dépasse très largement mes compétences).
Donc, ma solution (pompée sur stackoverflow comme il se doit) pour récupérer des arrays Numpy est la suivante:
1. convertir les arrays en chaine de caractères
2. inclure cette chaine de caractères dans le lien de données
En python ça nous fait :
```python
import numpy as np
from IPython.display import HTML
mon_tableau = np.array([[1,2,3],[4,5,6]])
mon_str = np.array2string(mon_tableau)
lien = "texte_du_lien"
HTML(lien)
```
Surprise: dans les données téléchargées avec Firefox il n'y a pas de saut de ligne. Ça apparait comme ça dans Kate :
```
[[1 2 3] [4 5 6]]
```
Alors que les mêmes données, téléchargées avec un navigateur basé sur Chromium, s'affichent correctement (toujours dans Kate) :
```
[[1 2 3]
[4 5 6]]
```
Il parait que c'est normal et que ce n'est pas possible d'inclure des sauts de ligne lorsque l'encodage est en autre chose que base64 (cf. cette [discussion](https://stackoverflow.com/questions/17532900/preserving-newline-characters-in-datatext-uri)). Bon, soit ! Je m'exécute et je convertis en base64, ce qui, (i) est très moche, (ii) augmente inutilement la longueur du lien (ce qui peut être problématique en particulier si le tableau contient beaucoup de données). Et donc on obtient :
```python
import base64
import numpy as np
from IPython.display import HTML
mon_tableau = np.array([[1,2,3],[4,5,6]])
mon_str = np.array2string(mon_tableau)
mon_str = base64.b64encode(mon_str.encode('ascii')) #conversion vers base64
mon_str = str(mon_str).replace("'","").replace("b","") #supprime le préfixe b (byte) et les guillemets
lien = "texte_du_lien"
HTML(lien)
```
En effet ça fonctionne maintenant avec Firefox. Alors, outre le fait que ces conversions string -> base64 -> string m'arrachent l'oeil (je suis preneur d'une solution plus élégante), je m'interroge: pourquoi ça marche dans les navigateurs basés sur Chromium (par exemple Vivaldi ou Chromium lui-même) et pas dans mon navigateur préféré ?