ecrire chaine utf8 json à partir d'un dictionnaire

ecrire chaine utf8 json à partir d'un dictionnaire - Python - Programmation

Marsh Posté le 05-02-2018 à 09:45:09    

Bonjour,
 
je souhaite extraire des données d'un fichier excel ( avec le module xlrd ) pour ensuite générer des fichiers javascript contenant des variables json pouvant contenir des caractères utf8 ( génération de fichier de traduction de langue ). Je me retrouve dans la problématique suivante ne maitrisant absolument pas le python :
 

Code :
  1. >>> t = { string : "에스디 없음" }
  2. Traceback (most recent call last):
  3.   File "<pyshell#2>", line 1, in <module>
  4.     t = { string : "에스디 없음" }
  5. NameError: name 'string' is not defined
  6. >>> t = { "string" : "에스디 없음" }
  7. >>>
  8. >>>
  9. >>> print (t)
  10. {'string': '에스디 없음'}
  11. >>>
  12. >>>
  13. >>> import json
  14. >>> j = json.dumps(t)
  15. >>> print (j)
  16. {"string": "\uc5d0\uc2a4\ub514 \uc5c6\uc74c"}
  17. >>> k = json.dumps(t).encode("utf8" )
  18. >>> print (k)
  19. b'{"string": "\\uc5d0\\uc2a4\\ub514 \\uc5c6\\uc74c"}'
  20. >>>


 
je ne sais pas comment faire pour que mon "dumps" que je vais écrire ensuite dans un fichier puisse contenir non pas la traduction ascii des caractères utf8 ( avec le \u ) mais directement le caractère utf8.
 
Je pense que j'aurai un problème après, le fic.write n'acceptera peut être pas ma string mais ca sera un second sujet  :jap:  
 
Merci pour votre aide :)

Reply

Marsh Posté le 05-02-2018 à 09:45:09   

Reply

Marsh Posté le 05-02-2018 à 09:54:52    

bon, si je mets  
 

Code :
  1. j = json.dumps(t , ensure_ascii = False)


 
ca fonctionne.
 
Sauf que dans mon exemple ca fonctionne, je peux print(j) , mais dans mon code ,j'ai une erreur  
 


Error'charmap' codec can't encode character '\u2026' in position 756: character maps to <undefined>


 
Je suppose que cela veut dire qu'il y a un caractère non utf8 dedans ? Mais comment savoir lequel :p  
 
Et évidemment le write dans le fichier derrière échoue également mais bizarrement, pas à la même position :
 


file : bundle_en.js
Error'charmap' codec can't encode characters in position 2709-2715: character maps to <undefined>


 

Reply

Marsh Posté le 05-02-2018 à 12:20:49    

xilebo a écrit :

bon, si je mets

 
Code :
  1. j = json.dumps(t , ensure_ascii = False)
 

ca fonctionne.

 

Sauf que dans mon exemple ca fonctionne, je peux print(j) , mais dans mon code ,j'ai une erreur

 


Error'charmap' codec can't encode character '\u2026' in position 756: character maps to <undefined>

 

Je suppose que cela veut dire qu'il y a un caractère non utf8 dedans ? Mais comment savoir lequel :p


Non, ça veut dire que dans ton bricolage le codec "charmap" est sélectionné et ne sait pas encoder U+2026 (HORIZONTAL ELLIPSIS).

 

1. json a une fonction `dump` qui sort directement dans un fichier (ou pseudo-fichier)
2. `open` en mode texte prend un encodage, donne lui le bon

Code :
  1. with open(a_file_path, mode='w', encoding='utf-8') as f:
  2.    json.dump(t, f, ensure_ascii=False)



Message édité par masklinn le 05-02-2018 à 12:21:07

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 05-02-2018 à 13:29:13    

Merci pour ta réponse :)
 
Comment je sélectionne le bon charmap, et surtout à quel endroit ?
 
J'ai réussi à m'en sortir de la façon suivante :  
- j'ai supprimé le caractère indésirable qui correspond au 3 petits points en un seul caractère ( à cause de l'auto completion de Excel ).
- je suis passé en écriture binaire wb + bytes( string, "utf8" ) mais je pense que ca revient au même à ce que tu m'as donné pour le open.
 
 
Pour finir, le résultat semble correct, pour autant, quand j'ouvre le fichier .js avec notepad++ , il n'arrive pas à reconnaitre l'encodage , je suis obligé de forcer utf8. Quand j'enregistre le résultat, je vois qu'il a rajouté le BOM au début. Ok. Sauf que si je prends le fichier original de mon prestataire ( fichier json ) , il n'y a pas de BOM, pourtant notepad++ arrive à détecter que le fichier est "utf8 sans BOM" directement.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed