#1 Le 24/01/2011, à 17:28
- ehmicky
[Résolu]Connaître la taille d'un caractère
Salut à tous,
J'ai besoin de connaître la taille d'une chaine de caractères pour des raisons de mise en forme : je ne dois afficher qu'une chaîne de caractères prenant six "cases". Je fais donc :
$ a="abcdefghij"
$ echo "${#a}"
10
$ echo "${a:0:6}"
abcdef
Le problème, c'est que les sinogrammes prennent toujours deux "cases" pour un seul caractère, ce qui décale la mise en forme :
$ a="日日日日日日日日日日"
$ echo "${#a}"
10
$ echo "${a:0:6}"
日日日日日日
Et un utilisateur de mon script s'en est plaint, comme quoi faut tout prévoir
Or, je vois pas comment connaître la taille "physique", "à l'écran" d'une string. J'ai pensé à regarder le code hexa de chaque caractère, et à rajouter un supplément s'il tombe dans une plage UTF-8 réservée aux caractères CJK mais je crois que ça va être pénalisant au niveau des performances (et ce sera valable que pour UTF-8) alors que justement ça tombe sur un bout de code qu'il faut vraiment optimiser.
Auriez-vous une solution ? Merci !
Edit : une solution qui vaut ce qu'elle vaut, parce que c'est valable qu'en UTF-8, et ça fait buguer certains caractères Unicode étant coincés entre les idéogrammes CJK mais n'en étant pas :
a="${1//[$'\xe2'-$'\xef']}"
b="${1//[$'\xf0'-$'\xff']}"
echo $(( ${#a} + ( ${#b} - ${#1} ) / 2 ))
Dernière modification par ehmicky (Le 25/01/2011, à 13:19)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#2 Le 25/01/2011, à 12:00
- Totor
Hors ligne
#3 Le 25/01/2011, à 13:20
- ehmicky
Re : [Résolu]Connaître la taille d'un caractère
Merci, problème résolu !
Au passage, exist-t-il un moyen de connaître la position courante du curseur avec tput ?
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#4 Le 25/01/2011, à 14:02
- Totor
Re : [Résolu]Connaître la taille d'un caractère
je n'ai pas trouvé ou peut être que je n'ai pas regardé suffisamment entre les lignes du man terminfo ([très] difficile à digérer !).
-- Lucid Lynx --
Hors ligne
#5 Le 25/01/2011, à 14:12
- FRUiT
Re : [Résolu]Connaître la taille d'un caractère
There is no terminfo sequence defined for this functtion. In general, it's not needed because there is a sequence 'mrcup' that works just like 'cup' except that for mrcup the commands are relative to the current current position rather than an absolute position. The bad news is that not all that many terminfo definitions have mrcup because it was really never needed for curses.
http://forums13.itrc.hp.com/service/for … dId=563211
Sinon il y a tput sc et tput rc, mais pas de fonction directe il semblerait.
[EDIT] Et sinon, sans tput il y a echo -e "\033[6n" mais tu as du le voir dans l'autre post.
Dernière modification par FRUiT (Le 25/01/2011, à 14:15)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#6 Le 25/01/2011, à 14:19
- ehmicky
Re : [Résolu]Connaître la taille d'un caractère
Merci à vous deux,
Problème résolu
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne