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

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

Marsh Posté le 26-02-2013 à 14:40:41    

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
Reply

Marsh Posté le 26-02-2013 à 14:40:41   

Reply

Marsh Posté le 26-02-2013 à 15:23:41    

solution : CStringA  
 

Citation :

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


---------------
ras
Reply

Marsh Posté le 26-02-2013 à 15:30:16    

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.

Reply

Marsh Posté le 26-02-2013 à 18:04:59    

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
Reply

Marsh Posté le 26-02-2013 à 20:47:14    

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
Reply

Marsh Posté le 27-02-2013 à 12:00:00    

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
Reply

Marsh Posté le 27-02-2013 à 13:43:02    

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é!  --
Reply

Marsh Posté le 27-02-2013 à 18:49:05    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed