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

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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