Narf! Geschrieben 27. April 2021 Geschrieben 27. April 2021 (bearbeitet) Guten Tag an alle, ich erhalte aus einer Datenbank einen XML-String mit verschiedenen Elementen. Unter anderem ist da ein Buchtitel dabei, wo ein langer Gedankenstrich vorkommt. Der String wird in einer Messagebox fehlerfrei angezeigt. Wandle ich mit WideCharToMultiByte diesen Text um, erhalte ich – als Ergebnis für den Gedankenstrich. Die Anzeige macht hier keine Probleme. Wenn ich den gewandelten String in eine Datei speichern will, wird nur bis zu diesem â geschrieben, der Rest fehlt. Auch wenn ich diesen String direkt an ISAXXMLReader::parse übergebe, kommt ein Fehler, da nicht das ganze Dokument verarbeitet werden kann. Wo habe ich einen Ansatzpunkt? Ich verwende VC++ 2017 und MFC. Bearbeitet 27. April 2021 von Narf! Zitieren
blaargh Geschrieben 27. April 2021 Geschrieben 27. April 2021 In deiner Problemdarstellung gibt es viele Schnittstellen, die als Außenstehender nicht wirklich greifbar sind, deswegen versuch ich mal eine allgemeine Antwort zu geben: Grundsätzlich gäbe es gar kein Problem den langen Gedankenstrich in einem std::string zu speichern. Unter Kubuntu mit g++ 9.3.0 funktioniert das ohne Probleme. Also in etwa so: #include <iostream> int main() { std::string s = "—"; std::cout << s << std::endl; return 0; } Du rufst aber anscheinend eine Funktion mit dem Namen WideCharToMultiByte auf... also ist der Eingangsstring ein wstring, den du in einen string konvertieren möchtest? Falls dem so ist, kenne ich dafür nur die C++ Variante ohne Fremdbibliotheken, in etwa so: #include <iostream> #include <codecvt> #include <locale> using namespace std; int main() { wstring wstr = L"—"; static wstring_convert<codecvt_utf8<wchar_t>> myconv; string str = myconv.to_bytes(wstr); cout<<str<<endl; return 0; } Beide Varianten funktionieren problemlos mit dem langen Gedankenstrich. Gleichermaßen kannst du auch strings nach wstring wandeln, dafür würde man dann statt der to_bytes funktion die from_bytes funktion verwenden. Hilft dir das weiter? Ansonsten müsstest du deine Frage nochmal präzisieren. Zitieren
Narf! Geschrieben 29. April 2021 Autor Geschrieben 29. April 2021 Hallo blaargh, das Umwandeln ist nicht das Problem, sondern das Speichern in eine Datei bzw. das weitere Verwenden der Variable. CString m_str=L"–"; int iBuf=WideCharToMultiByte(CP_UTF8, NULL, m_str, -1, NULL, NULL, NULL, NULL); char *newString=new char[iBuf+10]; WideCharToMultiByte(CP_UTF8, NULL, m_str, -1, newString, iBuf, NULL, NULL); m_str=newString; //-- gewandelt – delete[] newString; //-- String in Datei speichern CStdioFile file; if(file.Open(strFile, CFile::modeCreate|CFile::modeWrite|CFile::typeText)) { file.WriteString(m_str); file.Close(); //-- Geschrieben wird nur â //-- Prüfen, ob der gesamte String geschrieben wurde. CFileStatus fStat; CFile::GetStatus(strFile, fStat); if(fStat.m_size!=m_str.GetLength()) { MessageBox(GetConsoleWindow(), L"Der String wurde unvollständig geschrieben.\n\n", L"Fehler", MB_ICONERROR|MB_OK); return false; }//end if(fStat.m_size!=m_str.GetLength()) }//end if(file.Open(strFile, CFile::modeCreate|CFile::modeWrite|CFile::typeText)) Zitieren
Narf! Geschrieben 29. April 2021 Autor Geschrieben 29. April 2021 So, wieder viel Theater um eine kleine Lösung. Statt m_str=newString; muss es m_str.Format(L"%S", newString); heißen. Jetzt klappt alles. Das Schlimme ist, dass das Selbe im gleichen Projekt schon mal korrekt vorkommt. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.