Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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!

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.

  • Autor

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

 

  • Autor

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.