Bonjour,
J'ai un problème de gestion de string UNICODE :
J'ai une interface grapique en C# d'ou je récupère une chaine de caractères à écrire dans un CSV. La partie écriture du fichier se fait depuis un DLL C++. Je passe par un Wrapper en C++/CLI pour faire le lien entre le C# et la DLL C++.
Dans mon Wrapper, je convertis en wstring ma chaine venant du C# :
La fonction ExportCSV est une fonction d'une DLL pur C++:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 int ExportW::doExportCSV(String ^data, String ^csvFile) { std::wstring dataStr(L""); std::wstring csvFileStr(L""); MarshalString(csvFile, csvFileStr); MarshalString(data, dataStr); return exportCSV(&dataStr, &csvFileStr); } void ExportW::MarshalString( String ^source, std::wstring& target) { using namespace Runtime::InteropServices; const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni(source)).ToPointer(); target = chars; Marshal::FreeHGlobal(IntPtr((void*)chars)); }
J'ai essayé plusieurs solutions (même écrire en binaire). A chaque chaque génération du fichier CSV, l'écriture s'arrète au premier caractère UNICODE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int ExportCSVDLL::exportCSV(std::wstring *data, std::wstring *csvFile) { wofstream ofs; ofs.open(csvFile->c_str()); //ofs << *data; // ofs << data->length() << endl; ofs.write(data->c_str(), sizeof(wchar_t) * data->length()); ofs.close(); return 0; }. J'ai l'impression qu'utiliser des wtring et wofstream n'est pas la bonne façon de faire.
Est-ce que qq un a une idée ? (autre façon d'écrire dans le fichier, utiliser autre chose que wtring...)
Merci,
Partager