Encodage fichier texte en UTF-8

cs_mark01 Messages postés 3 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 28 juillet 2004 - 16 févr. 2004 à 19:33
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012 - 16 févr. 2004 à 23:19
Bonjour,

j'ai lu de nombreux messages sur ce sujet mais je ne trouve pas ce qu'il me faut...
Voilà mon problème:
je developpe une appli en deux parties, une partie flash qui lit dans un fichier texte et une partie visual C++ qui écrit le fichier texte en question.
Le probleme est que je dois enregistrer le fichier texte en format UTF-8 pour que flash puisse lire l'accentuation et les caractères spéciaux... Ma question est : y a t'il une fonction ou un moyen quelconque de le faire.
Note: je reccupere les mots avec "GetDlgItemText()", j'ouvre/crée un fichier avec "fopen", je concatene avec la fonction "wsprintf" puis j'écris avec "fprintf". C'est vieux mais c'est comme ça que je sais faire...
Merci pour votre aide.
Mark01.

1 réponse

cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
16 févr. 2004 à 23:19
Bonjour,

Avec VC++ est livré un exemple. Tu peux rechercher dans le rep de VC les fichiers utf.c et utf.h.

Voici la procédure récupéré dans le ficheir uft.c qui permet la convertion en utf8. Dessous je te met les declarations des constantes... :

////////////////////////////////////////////////////////////////////////////
//
// UnicodeToUTF8
//
// Maps a Unicode character string to its UTF-8 string counterpart.
//
// 02-06-96 JulieB Created.
////////////////////////////////////////////////////////////////////////////

int UnicodeToUTF8(
LPCWSTR lpSrcStr,
int cchSrc,
LPSTR lpDestStr,
int cchDest)
{
LPCWSTR lpWC = lpSrcStr;
int cchU8 = 0; // # of UTF8 chars generated

while ((cchSrc--) && ((cchDest == 0) || (cchU8 < cchDest)))
{
if (*lpWC <= ASCII)
{
//
// Found ASCII.
//
if (cchDest)
{
lpDestStr[cchU8] = (char)*lpWC;
}
cchU8++;
}
else if (*lpWC <= UTF8_2_MAX)
{
//
// Found 2 byte sequence if < 0x07ff (11 bits).
//
if (cchDest)
{
if ((cchU8 + 1) < cchDest)
{
//
// Use upper 5 bits in first byte.
// Use lower 6 bits in second byte.
//
lpDestStr[cchU8++] = UTF8_1ST_OF_2 | (*lpWC >> 6);
lpDestStr[cchU8++] = UTF8_TRAIL | LOWER_6_BIT(*lpWC);
}
else
{
//
// Error - buffer too small.
//
cchSrc++;
break;
}
}
else
{
cchU8 += 2;
}
}
else
{
//
// Found 3 byte sequence.
//
if (cchDest)
{
if ((cchU8 + 2) < cchDest)
{
//
// Use upper 4 bits in first byte.
// Use middle 6 bits in second byte.
// Use lower 6 bits in third byte.
//
lpDestStr[cchU8++] = UTF8_1ST_OF_3 | (*lpWC >> 12);
lpDestStr[cchU8++] = UTF8_TRAIL | MIDDLE_6_BIT(*lpWC);
lpDestStr[cchU8++] = UTF8_TRAIL | LOWER_6_BIT(*lpWC);
}
else
{
//
// Error - buffer too small.
//
cchSrc++;
break;
}
}
else
{
cchU8 += 3;
}
}

lpWC++;
}

//
// Make sure the destination buffer was large enough.
//
if (cchDest && (cchSrc >= 0))
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return (0);
}

//
// Return the number of UTF-8 characters written.
//
return (cchU8);
}

//
// Constant Declarations.
//

#define ASCII 0x007f

#define SHIFT_IN '+' // beginning of a shift sequence
#define SHIFT_OUT '-' // end of a shift sequence

#define UTF8_2_MAX 0x07ff // max UTF8 2-byte sequence (32 * 64 = 2048)
#define UTF8_1ST_OF_2 0xc0 // 110x xxxx
#define UTF8_1ST_OF_3 0xe0 // 1110 xxxx
#define UTF8_TRAIL 0x80 // 10xx xxxx

#define HIGER_6_BIT(u) ((u) >> 12)
#define MIDDLE_6_BIT(u) (((u) & 0x0fc0) >> 6)
#define LOWER_6_BIT(u) ((u) & 0x003f)

#define BIT7(a) ((a) & 0x80)
#define BIT6(a) ((a) & 0x40)

Voilà, avec tout ceci tu est capable d'encoder du texte en UFT8.

@+
Arnotic
Admin CS, MVP Visual C++
-1
Rejoignez-nous