Fichier UTF8

Signaler
Messages postés
107
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
15 juillet 2009
-
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
-
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

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
Messages postés
107
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
15 juillet 2009

Est-ce que quelqu'un à un exemple en C ???

Merci d'avance.

>> NiCoMpX <<
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
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
Messages postés
107
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
15 juillet 2009

Merci, j'attend la traduction.

>> NiCoMpX <<
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
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
Messages postés
107
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
15 juillet 2009

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 <<
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
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
Messages postés
107
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
15 juillet 2009

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 <<
Messages postés
107
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
15 juillet 2009

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 <<
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
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