Fichier UTF8

nicompx Messages postés 107 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 15 juillet 2009 - 5 janv. 2007 à 16:23
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 26 janv. 2007 à 22:17
Bonjour,

J'ai besoin de créer un fichier UTF8 en C, comment faire?
En sachant que j'utilise les fonctions suivantes :

fichier = fopen(cName,"w");
fwrite("cTextes",1,sizeof(cTextes),fichier);
fclose(fichier);

Merci d'avances

>> NiCoMpX <<

11 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 janv. 2007 à 18:57
C'est pas pour ton problème de codage UTF8 mais:

fwrite("cTextes",1,sizeof(cTextes),fichier);


sizeof(cTextes) !!!!!! cTexte n'est pas une variable. Il doit y avoir
des érreurs à la compilation non? Et même si il s'agissait d'un char *,
un char * vaut TOUJOURS 4 octets en 32bits car c'est un pointeur. Pour
avoir la taille d'une chaine contenue dans un tableau ou pointé par un char *, on utilise strlen ou on fait sa propre fonction ou macro.

Il y a certaines exeptions où utiliser sizeof serais beaucoup plus rapide

 exemple:

char toto[] = "salut a tous";

Dans ce cas présent, toto contien exactement le bon nombre de
caractère+1 (caractère de fin de chaine). On peut donc faire
sizeof(toto)-1 étant donné qu'il s'agit de char (1 octet)


Sinon, on écrit la taille manuellement:

fwrite("cTextes",1,7,fichier);  ça devrais mieu fonctionner ainsi.

C++ (@++)<!--
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
6 janv. 2007 à 11:10
0
nicompx Messages postés 107 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 15 juillet 2009
9 janv. 2007 à 16:03
Est-ce que quelqu'un à un exemple en C ???

Merci d'avance.

>> NiCoMpX <<
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
9 janv. 2007 à 20:28
salut,

l'important n'est pas tant le langage mais l'ALGO et en gros, voir ce qui est passé à l'api pour tester...

sinon :
http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_21439089.html
http://www.codeguru.com/forum/archive/index.php/t-231165.html
http://www.codase.com/search/call?name=MultiByteToWideChar

si j'ai 5 minutes, je traduirais le snippet sur codyx...

ShareVB
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nicompx Messages postés 107 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 15 juillet 2009
10 janv. 2007 à 09:49
Merci, j'attend la traduction.

>> NiCoMpX <<
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
11 janv. 2007 à 22:04
salut,

je vais le mettre ici d'abord pour test :

#include <windows.h>

DWORD WToUTF8(LPWSTR wText,LPSTR szBuff,DWORD cbBuff)
{
    DWORD vSize = lstrlenW(wText);
    ZeroMemory(szBuff,cbBuff*sizeof(char));
    return WideCharToMultiByte(CP_UTF8, 0, wText, vSize, szBuff, cbBuff, NULL, NULL);
}

DWORD UTF8ToW(LPSTR wText,LPWSTR wszBuff,DWORD ccBuff)
{
    DWORD vSize = lstrlenA(wText);
    ZeroMemory(wszBuff,ccBuff*sizeof(WCHAR));
    return MultiByteToWideChar(CP_UTF8, 0, wText, vSize, wszBuff, ccBuff);
}

DWORD WToOEM(LPWSTR wText,LPSTR szBuff,DWORD cbBuff)
{
    DWORD vSize = lstrlenW(wText);
    ZeroMemory(szBuff,cbBuff*sizeof(char));
    return WideCharToMultiByte(CP_OEMCP, 0, wText, vSize, szBuff, cbBuff, NULL, NULL);
}

DWORD OEMToW(LPSTR wText,LPWSTR wszBuff,DWORD ccBuff)
{
    DWORD vSize = lstrlenA(wText);
    ZeroMemory(wszBuff,ccBuff*sizeof(WCHAR));
    return MultiByteToWideChar(CP_OEMCP, 0, wText, vSize, wszBuff, ccBuff);
}

int _tmain(int argc, _TCHAR* argv[])
{
    LPSTR sz = "EBArtSoft%20-%20éà éçڳگڦฝ";
    char szBuff[256];
    WCHAR wszBuff[256];
    UTF8ToW(sz,wszBuff,256);
    WToOEM(wszBuff,szBuff,256);

    printf(
        "Original : %s\n"
        "LPSTR : %s\n"
        "LPWSTR : %ws\n",
        sz,
        szBuff,
        wszBuff
    );

    getchar();

    return 0;
}

ShareVB
0
nicompx Messages postés 107 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 15 juillet 2009
24 janv. 2007 à 11:42
Salut,

Merci beaucoup pour la traduction.
Ce qui m'intéresse c'est la convertion UTF8, je viens de la tester et je pense qu'il y a un problème.

>> NiCoMpX <<
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
25 janv. 2007 à 10:32
salut,

il y a un problème...il y en a peut être même plusieurs...mais lesquels :)) ...le seul problème que je vois c'est l'affichage dans la console qui effectivement ne se fait pas bien mais ca vient de la console qui est en OEM je crois...si tu mets un break point sur le printf et que tu regardes le contenu de sz, szBuff et wszBuff je pense que le résultat est correcte...

sinon détailles le problème...

ShareVB
0
nicompx Messages postés 107 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 15 juillet 2009
26 janv. 2007 à 09:48
Salut,

J'aimerais faire l'inverse, c-à-d convertire une string en UTF8.
As-tu testé la conversion d'une string en UTF8?
Quand tu regarde la différence entre une string (normale) et une string encodée en UTF8 tu remarque que chaques caractères est suivit de 0x00.

HELP HELP  !!!!!!   ;-)

Merci d'avance,

>> NiCoMpX <<
0
nicompx Messages postés 107 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 15 juillet 2009
26 janv. 2007 à 15:28
Salut,

L'exemple ci-dessus fonctionne très bien, par contre ce n'est pas ca que je veux faire.

Je veux encoder un fichier au format UTF16.
Je pense qu'un fichier au format UNICODE commence par FFh FEh (appellé BOM), puis chaque caractères est suivit de 00h.

Exemple : 

Le fichier suivant contient SALUT.

FF FE 53 41 55 54

Comment encoder un tels fichier en C ?

Meci d'avance.

>> NiCoMpX <<
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
26 janv. 2007 à 22:17
salut,

peut être : http://www.cppfrance.com/code.aspx?ID=18655

UTF8 : caractère sur un ou deux octets suivant la lettre...
UTF16 : full unicode...

ShareVB
0
Rejoignez-nous