Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1593 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [c++][encodage UTF-16] longueur d'une string

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c++][encodage UTF-16] longueur d'une string

n°2177567
kaillou38
mouton à numéro
Posté le 26-02-2013 à 14:40:41  profilanswer
 

Bonjour,
 
j'ai un petit problème de calcul d'une longueur d'une string en C++ (je manipule des CString ou des LPTSTR)
 
le problème, c'est que j'ai des caractères en Hindi et en latin mélangés.
les caractères en Hindi font 3 octets, ceux en latin 1.
 
si je demande la taille via un GetLength, _tcslen, strlen, j'obtiens le nombre de caractère. Ce dont j'ai besoin, c'est de la taille en octet, parce qu'il faut que je copie ca dans des descripteurs qui font max 255 octets.
 
j'ai essayé de convertir en tableau de byte, sans grand succès
 
Si quelqu'un a une idée, à part compter caractère par caractère...
 


---------------
ras
mood
Publicité
Posté le 26-02-2013 à 14:40:41  profilanswer
 

n°2177581
kaillou38
mouton à numéro
Posté le 26-02-2013 à 15:23:41  profilanswer
 

solution : CStringA  
 

Citation :

CStringA strISO = CT2A(str, CodePage);
 return strISO.GetLength();


---------------
ras
n°2177584
tpierron
Posté le 26-02-2013 à 15:30:16  profilanswer
 

Moué, faut faire un peu attention avec les chaines unicode, c'est facile d'utiliser les API avec le mauvais encodage.
 
Tu as l'air d'utiliser l'API Windows. En natif, Windows reconnait deux encodages : code page 8bit (dépendant de la langue) et UTF-16. En UTF-16, les caractères font soit 2 ou 4 octets (l'immense majorité n'en font que 2, ce qui inclus 90% des langues du monde entier, incluant l'Hindi).
 
Un caractère de 3 octets indique plutôt un encodage en UTF-8, que Windows ne sait pas gérer nativement, mais que tu peux convertir en UTF-16, via la fonction MultiByteToWideChar.
 
Si tu veux récupérer la taille en octet d'une chaine UTF-16, tu peux utiliser un truc du genre :

Code :
  1. wchar_t msg[] = L"Hello world";
  2. int sz = (wcslen(msg)+1) * 2;


 
Pour récupérer la taille d'une chaine UTF-8, strlen() est suffisante.

n°2177641
kaillou38
mouton à numéro
Posté le 26-02-2013 à 18:04:59  profilanswer
 

c'est mon format d’écriture de sortie (en ISO) qui est sur 1 ou 3 caractères, donc faut que je convertisse mon UTF16 d'entrée et manipulé en interne en ANSI au moment ou je veux savoir la taille de ma string.
d'ou la transfo en CStringA (oui c'est de l'API microsoft) qui marche bien.


Message édité par kaillou38 le 26-02-2013 à 18:07:30

---------------
ras
n°2177660
I_m_back
Posté le 26-02-2013 à 20:47:14  profilanswer
 

Ca m'étonne ton problème : visiblement getLenght retourne le nombre d'octets (peut être le nombre de wchar_t en compilation unicode)
 
http://msdn.microsoft.com/en-us/li [...] s.60).aspx


---------------
Ta peau de nacre noir, la courbe de ton cul
n°2177725
kaillou38
mouton à numéro
Posté le 27-02-2013 à 12:00:00  profilanswer
 

oui, je l'ai vu cette doc, et l'ai utilisé plein d'espoir, mais ça marche que avec un CStringA, avec un CString (compilé en unicode, donc CStringW?), j'ai juste le nombre de caractères.


---------------
ras
n°2177750
gilou
Modérateur
Modzilla
Posté le 27-02-2013 à 13:43:02  profilanswer
 

kaillou38 a écrit :

si je demande la taille via un GetLength, _tcslen, strlen, j'obtiens le nombre de caractère. Ce dont j'ai besoin, c'est de la taille en octet, parce qu'il faut que je copie ca dans des descripteurs qui font max 255 octets.

D'après la doc microsoft, strlen donne le nb d'octets:

Citation :

However, strlen interprets the string as a single-byte character string, so its return value is always equal to the number of bytes, even if the string contains multibyte characters.

cf http://msdn.microsoft.com/en-us/li [...] s.80).aspx
 

Citation :

Un caractère de 3 octets indique plutôt un encodage en UTF-8, que Windows ne sait pas gérer nativement, mais que tu peux convertir en UTF-16, via la fonction MultiByteToWideChar.

L'intérêt de l'utf-8, c'est qu'il permet d'utiliser toutes les fonctions de la librairie C standard, les chaines étant des chaines C (suite d'octets terminée par un 0), bref d'avoir un minimum de modifications à apporter au code de son soft pour le rendre unicode, pour un certain type de softs.
A+,


Message édité par gilou le 27-02-2013 à 13:49:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2177842
I_m_back
Posté le 27-02-2013 à 18:49:05  profilanswer
 

kaillou38 a écrit :

oui, je l'ai vu cette doc, et l'ai utilisé plein d'espoir, mais ça marche que avec un CStringA, avec un CString (compilé en unicode, donc CStringW?), j'ai juste le nombre de caractères.


 
avec un CStringW, je pense que ça te retourne le nombre de mots (de deux octets)
 
Mais je ne comprends pas l'interet d'utiliser un CStringW pour stocker de l'utf8 :o


Message édité par I_m_back le 27-02-2013 à 18:49:51

---------------
Ta peau de nacre noir, la courbe de ton cul

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [c++][encodage UTF-16] longueur d'une string

 

Sujets relatifs
Problème incompréhensible avec htmlentities et UTF-8Problème d'encodage.
Automatisation de "remplacement" String texte - codeAide formulaire d'encodage de données
Encodage comportant le plus d'accents.[C] Conversion type énuméré en string pour affichage :
asynchronous task avec connection string d'une application fille[C] retourner un tableau de string
Problème d'encodageAutohotkey - Encodage
Plus de sujets relatifs à : [c++][encodage UTF-16] longueur d'une string


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR