Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pyrtf et encoding

7 réponses
Avatar
Olivier Ravard
Bonjour,

Quelqu'un a-t-il déjà utilisé PyRTF avec un encodage autre que latin-1 ?
(par exemple UTF-8ou UTF-16).
J'aimerais avoir un retour d'expérience car je n'arrive pas à générer correctement
un document lorsque je dois y mettre des chaînes UTF-8.

Merci.

Olivier

7 réponses

Avatar
jean-michel bain-cornu
Bonjour,
Quelqu'un a-t-il déjà utilisé PyRTF avec un encodage autre que latin-1 ?
(par exemple UTF-8ou UTF-16).
J'aimerais avoir un retour d'expérience car je n'arrive pas à générer
correctement
un document lorsque je dois y mettre des chaînes UTF-8.
Tu peux préciser les difficultés que tu rencontres ?

Théoriquement, il y a juste à convertir les chaînes utf8 en latin1,
indépendamment de l'outil utilisé, en faisant par exemple :
chaineUnicode.encode('latin-1')
A+
jm

Avatar
Méta-MCI
Bonjour !


En RTF, les caractères unicode sont codés en décimal, précédés de 'u' et
suivis de '?'
Par exemple, le caractère unichr(1234) est codé : u1234?
De plus, pour les codes > 32767, il faut enlever 65536 (ils deviennent donc
négatifs).

Je ne sais pas comment sont gérés les surrogates.


Petit question annexe : travailles-tu avec la version d'origine (0.45) de
PyRTF, ou avec celle que j'ai (très légèrement) modifiée ?


@-salutations

Michel Claveau
Avatar
Olivier Ravard
jean-michel bain-cornu wrote:
Bonjour,
Quelqu'un a-t-il déjà utilisé PyRTF avec un encodage autre que latin-1 ?
(par exemple UTF-8ou UTF-16).
J'aimerais avoir un retour d'expérience car je n'arrive pas à générer
correctement
un document lorsque je dois y mettre des chaînes UTF-8.
Tu peux préciser les difficultés que tu rencontres ?

Théoriquement, il y a juste à convertir les chaînes utf8 en latin1,
indépendamment de l'outil utilisé, en faisant par exemple :
chaineUnicode.encode('latin-1')


Pour préciser :

Je lis des caractères depuis un fichier catalogue encodé en UTF-8.
L'encodage par défaut de ma distrib python est UTF-8.
Lorsque je fais :
section.append( 'éàè')
-> ça marche

section.append('xc3xa9xc3xa0xc3xa8')
-> marche pas. La chaîne donnée correspond à 'éàè' encodée en utf-8.

section.append('xc3xa9xc3xa0xc3xa8'.decode('utf-8').encode('latin-1'))
-> ça marche (comme tu l'as suggéré)

OK. Mais le problème est que je veux créer un fichier avec des caractères qui
ne peuvent pas s'encoder en latin-1 (chinois par exemple) :

section.append('xe7xb7xa8xe7xa8x8b'.decode('utf-8').encode('latin-1'))
-> et là, j'ai une exception UnicodeEncodeError

A+
jm



Avatar
Olivier Ravard
Méta-MCI wrote:
Bonjour !


En RTF, les caractères unicode sont codés en décimal, précédés de 'u' et
suivis de '?'
Par exemple, le caractère unichr(1234) est codé : u1234?
De plus, pour les codes > 32767, il faut enlever 65536 (ils deviennent donc
négatifs).
Sachant celà est-t-il possible d'écrire tout caractère unicode ?

Pourtant lorsque je fais par exemple section.append('u7de8u7a0b'), je
n'ai pas le résultat espéré...

Je ne sais pas comment sont gérés les surrogates.


Petit question annexe : travailles-tu avec la version d'origine (0.45) de
PyRTF, ou avec celle que j'ai (très légèrement) modifiée ?




Je travaille avec la version originale. Quelles sont les modifs de ta version ?

@-salutations

Michel Claveau





Avatar
Méta-MCI
Bonsoir.

Les modifs, c'est pas grand chose :

dans Renderer.py :
- supprimé une ligne "FontPanose", dans _WriteFonts
- ajouté ' par' dans LINE (2 endroits)
(ces deux points, pour adapter au genre de RTF que je manipule).

puis :
- fait un distutils, pour faire une installation plus "pythonesque"

C'est tout...


Pour le reste : "section.append('u7de8u7a0b')" Attention, le code doit
être en DECIMAL, pas en hexa. Et puis, il faut un caractère "?" pour
terminer chaque caractère.


@-salutations

Michel Claveau
Avatar
Olivier Ravard
Méta-MCI wrote:
Bonsoir.

Les modifs, c'est pas grand chose :

dans Renderer.py :
- supprimé une ligne "FontPanose", dans _WriteFonts
- ajouté ' par' dans LINE (2 endroits)
(ces deux points, pour adapter au genre de RTF que je manipule).

puis :
- fait un distutils, pour faire une installation plus "pythonesque"

C'est tout...


Pour le reste : "section.append('u7de8u7a0b')" Attention, le code doit
être en DECIMAL, pas en hexa. Et puis, il faut un caractère "?" pour
terminer chaque caractère.



Yes! ça marche. J'arrive à générer mon pdf avec des caractères chinois...
Merci...

Olivier


@-salutations

Michel Claveau







Avatar
Méta-MCI
Salut !


Tant mieux, si ça marche.
Merci de l'avoir indiqué, car il y a souvent des messages dont on ne sait
pas le devenir.

Par contre, pour le chinois, j'émet des réserves : à ma connaissance, RTF
sait juste représenter des caractères unicodes (et encore, si on a la bonne
police), mais ne gère pas d'autres notions (unicode), comme le sens
d'écriture, ou la composition.

Allez : 263A (en UTF-8 : E2 98 BA)


@-salutations
--
Michel Claveau