Comment puis-je intégrer des constantes de chaîne Unicode dans un fichier source?
Je suis à l'écriture de tests unitaires qui sont en cours pour vérifier nos manipulation de diverses ressources qui utilisent d'autres jeux de caractères en dehors de la normale alphabet latin: Cyrilic, hébreu, etc.
Le problème que j'ai c'est que je ne peut pas trouver un moyen d'intégrer les attentes de la source de test de fichier: voici un exemple de ce que je suis en train de faire...
///
///Protected: TestGetHebrewConfigString
///
void CPrIniFileReaderTest::TestGetHebrewConfigString()
{
prwstring strHebrewTestFilePath = GetTestFilePath( strHebrewTestFileName );
CPrIniFileReader prIniListReader( strHebrewTestFilePath.c_str() );
prIniListReader.SetCurrentSection( strHebrewSubSection );
CPPUNIT_ASSERT( prIniListReader.GetConfigString( L"דונדארןמע" ) == L"דונהשךוק") );
}
Ce tout simplement ne fonctionne pas. Auparavant, j'ai travaillé autour de cette l'aide d'une macro qui appelle une routine pour transformer une étroite chaîne à une grande chaîne (nous utilisons towstring toute la place dans nos applications, il est donc code existant)
#define UNICODE_CONSTANT( CONSTANT ) towstring( CONSTANT )
wstring towstring( LPCSTR lpszValue )
{
wostringstream os;
os << lpszValue;
return os.str();
}
L'affirmation dans le test ci-dessus est alors devenu:
CPPUNIT_ASSERT( prIniListReader.GetConfigString( UNICODE_CONSTANT( "דונדארןמע" ) ) == UNICODE_CONSTANT( "דונהשךוק" ) );
Ce OK travaillé sur OS X, mais maintenant je suis de portage vers linux et je trouve que les tests sont tous à défaut: il se sent tous plus à du bidouillage. Quelqu'un peut-il me dire si elles ont une meilleure solution à ce problème?
source d'informationauteur jkp
Vous devez vous connecter pour publier un commentaire.
Fastidieux mais portable moyen est de construire vos chaînes à l'aide d'numérique des codes d'échappement. Par exemple:
devient:
Vous avez pour convertir tous vos caractères Unicode numérique échappe. De cette façon, votre code source devient de codage indépendant.
Vous pouvez utiliser des outils en ligne pour la conversion, comme cette une. Il sort de l'échappement JavaScript format
\uXXXX
il suffit donc de rechercher & remplacer\u
avec\x
pour obtenir le C format.Vous avez à dire à GCC qui l'encodage de votre fichier utilise le code de ces caractères dans le fichier.
Utiliser l'option
-finput-charset=charset
par exemple-finput-charset=UTF-8
. Ensuite, vous devez le dire à propos de l'encodage utilisé pour les littéraux de chaîne au moment de l'exécution. Qui permettra de déterminer les valeurs de la wchar_t éléments dans les cordes. Vous définissez que l'encodage en utilisant des-fwide-exec-charset=charset
par exemple-fwide-exec-charset=UTF-32
. Méfiez-vous que la taille de l'encodage (utf-32 besoins 32bits, utf-16 besoins 16bits) ne doit pas dépasser la taille dewchar_t
gcc utilise.Vous pouvez régler cela. Cette option est surtout utile pour la compilation de programmes pour
wine
conçu pour être compatible avec windows. L'option est appelée-fshort-wchar
et sera très probablement ensuite être 16bits au lieu de 32 bits, qui est sa largeur habituelle pour gcc sous linux.Ces options sont décrites plus en détail dans
man gcc
la gcc page de manuel.Ce n'est pas réellement le convertir entre les codages Unicode, ce qui nécessite une routine dédiée. Vous avez besoin de garder votre code source et les données codages unifiée - la plupart des gens utilisent en UTF-8, puis les convertir à l'OS d'encodage spécifiques si nécessaire (tel que UTF-16 sur Enrouleurs).