Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile
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 ! smile

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

Re : [Résolu]Connaître la taille d'un caractère

Salut,

cf ici


-- Lucid Lynx --

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 smile


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