Bonjour,
Je cherche à comparer deux variables de type std::string, qui doivent contenir du vocabulaire français (mots, phrases)... donc des accents.
Code : Sélectionner tout - Visualiser dans une fenêtre à part bool isEqual = (recognized == str_sentence)?true:false;
La condition n'est jamais vérifiée.
En bouclant sur chaque élément, pour les 2 variables, je m'aperçois:
- qu'elles n'ont pas la même taille.
- variable 1 : le code hexadécimal de la lettre 'è' est grand! (0xFFFFFFE8). Tout ces FF ne me disent rien de bon(4 octets?)
- variable 2 : que cette même lettre 'è' semble codée sur 2 indices (8 octets?)
Si la chaine à comparer est "allume la lumière", voilà ce que j'obtiens sur la sortie standard:
[item index] : [caractère affiché] --> [représentation hexadécimal]
- variable 1 : string recognized -
0 : a --> 61
1 : l --> 6c
2 : l --> 6c
3 : u --> 75
4 : m --> 6d
5 : e --> 65
6 : --> 20
7 : l --> 6c
8 : a --> 61
9 : --> 20
10 : l --> 6c
11 : u --> 75
12 : m --> 6d
13 : i --> 69
14 : --> ffffffe8
15 : r --> 72
16 : e --> 65
- variable 2 : string str_sentence -
0 : a --> 61
1 : l --> 6c
2 : l --> 6c
3 : u --> 75
4 : m --> 6d
5 : e --> 65
6 : --> 20
7 : l --> 6c
8 : a --> 61
9 : --> 20
10 : l --> 6c
11 : u --> 75
12 : m --> 6d
13 : i --> 69
14 : --> ffffffc3
15 : --> ffffffa8
16 : r --> 72
17 : e --> 65
La première variable est déclarée et initialisée comme ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 const char* hypothese = ps_get_hyp(ps, NULL, &uttid); // Une fonction de la librairie pocketsphinx qui renvoie un const char * string recognized(hypothese);
La seconde variable est issue du résultat d'un callback de sqlite3 qui est appelé autant de fois qu'il y a d'enregistrements retournés par la requête ("SELECT * FROM table WHERE ...")
D'après la documentation de SQLite, le format par défaut des résultats est UTF-8
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 struct datasBlock { vector< vector<string> > rows; }; int callback_result(void *datas, int argc, char **argv, char **azColName) { datasBlock *block = (datasBlock*)datas; int colCount = argc; if (colCount < 1) return 1; // crée un enregistrement en mémoire vector<string> tmpRow; for (int i=0; i<colCount; i++) tmpRow.push_back(argv[i]); block->rows.push_back(tmpRow); return 0; }
Pensez vous qu'il y ait quelque chose comme de l'UTF-16 ici que je devrais peut être d'abord convertir en UTF-8 avant de faire le test?
J'ai fouillé les classes string, wstring et tenté des conversion (mbstowcs et wcstombs), mais sans succès.
Et même vu quelque chose au sujet de la "locale"...
Certains parlent de la libiconv...
En fin de compte je crois que je suis parti dans tous les sens...
Auriez vous quelques pistes à me donner?
Merci pour vos réponses
PS:
Je ne comprend pas comment un élément/indice de type string peut contenir une si grande valeur vu que string se compose de <char> et que sizeof(char) vaut normalement toujours 1 octet:
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef basic_string<char> string; /// A string of @c char
Quelques précisions:
Mon OS est Linux UBuntu 12.04 LTS, mais je prévois également de faire tourner le code sous Windows.
J'utilise Qt, mais ne souhaite pas utiliser la classe QString à cet endroit du programme.
Partager