Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Galère avec font unicode
Slyvtt Hors ligne Maître du Puzzle Points: 2389 Défis: 17 Message

Galère avec font unicode

Posté le 25/07/2022 16:16

Hello,

je voudrais utiliser une font de 256 caractères, je passe donc par les fonts unicode supportées par gint/fxconv, mais j'ai un souci à l'affichage, je n'arrive pas à obtenir les caractères pour les indices supérieurs à 127 (+ deux caractères : le #128 et le #192)
J'obtiens donc cette sortie
alors que les caractères sont encodés entre 0 et 256 comme sur l'image ci-après .

J'ai suivi scrupuleusement (enfin je pense) le "howto" du gitea unicode-font sauf dans les sources où j'utilise dprint() au lieu de dtext().

Je serai pas contre un avis éclairé car là moi aussi je bugge, je vois pas ce qui cloche.

J'ai mis l'ensemble du projet en PJ (à compiler avec fxsdk build-cg).

Merki beaucoup par avance

Fichier joint


Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 25/07/2022 16:29 | #


Ah mais c'est parce que %c ne fait pas ce que tu veux. On balance pas juste des octets au hasard, c'est de l'UTF-8. Par exemple pour obtenir le caractère 0x81 :

% python
>>> bytes(chr(0x81), "utf8")
b'\xc2\x81'

Il faut écrire les deux octets 0xc2 et 0x81. %c ne fait pas ça.

Je peux ajouter ça, mais entre temps tu es supposé saisir les caractères Unicode proprement, ie. taper "╬" dans ton programme après avoir dessiné à la position U+256C dans la police.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Slyvtt Hors ligne Maître du Puzzle Points: 2389 Défis: 17 Message

Citer : Posté le 25/07/2022 16:43 | #


Ok, je comprends mieux alors. Ca risque pas de fonctionner en effet.
Je pensais que pour les 256 premiers caractères en utf8 ça pouvait encore passer comme ça , du fait que la font a toutes les infos graphiques des 256 premiers caractères. J'ai été trop optimiste

Donc en fait mon besoin c'est juste d'avoir l'étendue d'un unsigned char dans la police et de pouvoir le sortir via un "%c", comme sur un PC par exemple avec la table ASCII complète et pas seulement les 128 premiers caractères).

L'unicode c'est le canon pour tuer la mouche, et surtout c'est pas trop adapté à ce que je voudrais en faire.

C'est un truc lourd à dev ?

Du coup pourquoi ca me sort les caractères 128 et 192 ? une "coincidence" ?
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 25/07/2022 17:14 | #


Seuls les 128 premiers caractères sont accessibles "directement" en Unicode. La raison c'est que ça permet de garantir une propriété très utile de l'encodage : on est capables de se rendre compte quand tu coupes les caractères en deux.

Quand tu as un caractère multi-octet, les multi-octets sont tous supérieurs à 0x80. Par exemple le code point U+0081 c'est 0xc2 0x81 comme on vient de le voir. L'avantage de ça c'est que si tu sautes le premier octet pour une raison quelconque et que tu te retrouves avec 0x81, tu peux observer que c'est invalide et même déterminer combien d'octets il faut sauter pour atteindre le code point valide suivant. C'est un aspect important de l'encodage.

Le système de police de gint ne supporte que l'UTF-8 et je pense que ça devrait rester comme ça. Les encodages de texte c'est déjà franchement la merde dans le monde réel, alors autant ne pas en rajouter...

Générer une séquence UTF-8 à partir d'un code point n'est pas dur du tout ; d'ailleurs même la fonction qui décode ça dans gint en gérant les erreurs ne fait qu'une poignée de lignes.

Je peux l'ajouter à printf() (c'est supposé être supporté !), mais note que du coup le bon format c'est %lc. Je fais ça d'ici ce soir.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Slyvtt Hors ligne Maître du Puzzle Points: 2389 Défis: 17 Message

Citer : Posté le 01/08/2022 07:50 | #


Yo,
du coup Lephé, as tu eu le temps de jeter un oeil au support de l'extended ASCII (caractères 128-->255) dans gint ?
si oui, peux tu me dire comment inscrire le codage pour fxconv ? quel format faut il mettre (ascii ou autre chose) ?
si non, puis-je te demander cette évolution ?
Merci beaucoup
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 01/08/2022 12:30 | #


Merci pour le rappel - et pour le projet reproductible !

J'ai poussé le support de %lc sur le dépôt fxlibc, que tu peux pour l'instant récupérer sur la branche dev.

Dans ton code, remplace juste u8"%c" par "%lc" (le u8 ne sert que pour le compilateur, quand tu as des caractères spéciaux dans ta chaîne ; cette information n'est pas transférée à printf()), recompile, et ça devrait aller tout seul. Rien d'autre à faire ailleurs.

Je ne suis pas opposé à supporter ce qu'il te faut si tu as des soucis, mais avec les éléments disponibles pour l'instant je préfère rester autant que possible sur UTF-8. Quand on commence à avoir plusieurs encodages c'est vite casse bonbon... x_x
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Slyvtt Hors ligne Maître du Puzzle Points: 2389 Défis: 17 Message

Citer : Posté le 01/08/2022 13:28 | #


Non non t’inquiète pas. Le support de la table ascii dans toute sa gamme (255 caractères) est parfait. Je te remercie beaucoup.

J’avais vraiment pas en tête que gint gérait seulement les 128 premiers caractères.

Merci beaucoup.
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Slyvtt Hors ligne Maître du Puzzle Points: 2389 Défis: 17 Message

Citer : Posté le 01/08/2022 14:53 | #


Lephé,

j'ai posté une PR dans fxsdk pour supporter le type "extascii" qui permet d'avoir les 256 caractères via un png.

Et ça fonctionne.


J'ai préféré ne pas modifier le type "ascii" pour ne rien casser et garder par défaut le type avec "seulement" les 128 premiers caractères. Passer sur la table 256 demande donc une modification explicite du type en "extascii".
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 01/08/2022 15:01 | #


Cool. Je fusionne ça ce soir, encore que je le renommerai 8bit parce que l'appeler "ASCII" n'est jamais vraiment correct ; ASCII c'est 128 caractères, et "ASCII étendu" c'est un terme vague qui est utilisé par plein d'encodages différents dont aucun n'est supporté :P

Mais effectivement c'est plus pratique que d'avoir à créer un dossier.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Slyvtt Hors ligne Maître du Puzzle Points: 2389 Défis: 17 Message

Citer : Posté le 01/08/2022 16:25 | #


Oui bonne idée, en effet "extended ascii" n'a pas l'air d'être trop "consensuelle" comme appellation, 8bit ne prêtera pas à confusion.
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 03/08/2022 22:55 | #


Désolé pour le délai, ça m'a échappé un moment. Après avoir hésité j'ai fini par l'appeler 256chars parce que 8bit suggère trop que ça implique un encodage du texte en 8-bit fixé, ce qui n'est pas le cas.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Slyvtt Hors ligne Maître du Puzzle Points: 2389 Défis: 17 Message

Citer : Posté le 04/08/2022 07:59 | #


Ok nickel pas de problème.
Merci beaucoup. Effectivement ça ne prête pas à confusion comme ça.
There are only 10 types of people in the world: Those who understand binary, and those who don't ...

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 249 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd