longueur d'une string [c++][encodage UTF-16] - C++ - Programmation
Marsh Posté le 26-02-2013 à 15:23:41
solution : CStringA
Citation : CStringA strISO = CT2A(str, CodePage); |
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 :
|
Pour récupérer la taille d'une chaine UTF-8, strlen() est suffisante.
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.
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
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.
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+,
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
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