Conversion UTF-8 en caractères larges

#ifndef UNICODE #define UNICODE #endif #include  #include  #include  using namespace std; int main() { FILE* resFile; char multiByteStr[256]; ifstream oFile; FILE* exampleFile; TCHAR buffer[256]; system("chcp 65001"); resFile = _wfopen(L"foo",L"w, ccs=UTF-8"); fwprintf(resFile,L"%s",L"C:\\exsistingFolder\\zażółć gęśłą jaźń ☺☻♥♦• ć.txt"); fclose(resFile); oFile.open(L"foo"); oFile.getline(multiByteStr,256,'\n'); oFile.close(); MultiByteToWideChar(CP_UTF8,0,multiByteStr,256,buffer,256); wprintf(L"%s",buffer); exampleFile = _wfopen(buffer,L"w, ccs=UTF-16LE"); fwprintf(exampleFile,L"%s",buffer); fclose(exampleFile); system("pause"); return 0; } 

Comme vous pouvez le constater, le programme doit créer le fichier “foo” resFile qui contient le chemin complet du fichier à créer, et ce nouveau fichier exampleFile doit contenir un chemin vers lui-même. Bien que, pendant le débogage dans Visual studio 2010, les autos indiquent que la mémoire tampon de la mémoire tampon est correcte, exampleFile n’est pas créé. Pourquoi?
Et une autre chose: pourquoi wprintf ne wprintf pas de caractères étendus, bien que j’ai changé la police de la console pour Lucida Console – celle qui peut traiter les caractères non codés.

Ps. exampleFile pointe sur NULL , même après _wfopen , et le dernier caractère du tampon est '/0' .

Vous ne faites pas de traitement d’erreur. Plus important encore, lorsque vous appelez MultiByteToWideChar() , vous lui demandez de convertir le tampon multiByteStr entier, mais la plupart du tampon contient des déchets car vous ne l’aviez pas mis à zéro auparavant. Vous devez utiliser le nombre réel de caractères dans le tampon, pas la taille maximale du tampon. MultiByteToWideChar() est susceptible de retourner une erreur que vous ignorez. Il existe également plusieurs autres points d’échec dans le code. Vous devez toujours vérifier les erreurs, en particulier lors de l’interaction avec le système d’exploitation.

Essaye ça:

 #define UNICODE #include  #include  #include  using namespace std; void pause() { wcin.ignore(); wcin.get(); } int main() {  FILE* resFile;  char multiByteStr[256] = {0};  ifstream oFile;  FILE* exampleFile;  WCHAR buffer[256] = {0};  SetConsoleOutputCP(CP_UTF8);  resFile = _wfopen(L"foo",L"w, ccs=UTF-8"); if (!resFile) { wprintf(L"Unable to create foo"); goto done; }  fwprintf(resFile,L"%s",L"C:\\exsistingFolder\\zażółć gęśłą jaźń ☺☻♥♦• ć.txt");  fclose(resFile);  if (!oFile.open(L"foo")) { wprintf(L"Unable to open foo"); goto done; }  oFile.getline(multiByteStr,255,'\n');  oFile.close();  if (MultiByteToWideChar(CP_UTF8,0,multiByteStr,-1,buffer,256) == 0) { wprintf(L"Unable to convert UTF-8 to UTF-16. Error: %u", GetLastError()); goto done; }  exampleFile = _wfopen(buffer,L"w, ccs=UTF-16LE"); if (!exampleFile) { wprintf(L"Unable to create file: %s", buffer); goto done; }  fwprintf(exampleFile,L"%s",buffer);  fclose(exampleFile); wprintf(L"created file: %s", buffer); done: pause();  return 0; } 

Pourquoi mélanger et assortir vos bibliothèques d’E / S? Voici une solution pure (Windows) C, vérifiant sans erreur:

 #include  #include  int main() { FILE* pFile; wchar_t buffer[256]; _wfopen_s(&pFile,L"foo",L"w, ccs=UTF-8"); fputws(L"C:/existingFolder/zażółć gęśłą jaźń ☺☻♥♦• ć.txt",pFile); fclose(pFile); _wfopen_s(&pFile,L"foo",L"r, ccs=UTF-8"); fgetws(buffer,_countof(buffer),pFile); fclose(pFile); _wfopen_s(&pFile,buffer,L"w, ccs=UTF-16LE"); fputws(buffer,pFile); fclose(pFile); return 0; } 

La solution est très simple: _wfopen crée un fichier encodé en UTF-8 avec nomenclature et la fonction MultiByteToWideChar ne supprime pas la nomenclature.