Zum Inhalt springen

Empfohlene Beiträge

Geschrieben (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 von Narf!
Geschrieben

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.

Geschrieben

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))

 

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...