CString und UnicodeZeichen



  • Hallo zusammen,

    ich möchte in einem CString die einfache Methode "Replace()" anwenden.

    Allerdings soll in dem String ein in Deutschland übliches "ö" in ein dänisches getauscht werden. Das ist in Unicode so kodiert: http://www.fileformat.info/info/unicode/char/0153/index.htm
    also das Zeichen: "\u0153"

    Wenn ich das anwenden will:

    CString str;
    str = "knäggebröt schmöckt nöcht";
    str.Replace("ö","\u0153");  // geht nicht
    

    Wie wäre die Schreibweise bei der Unicode-Kodierung richtig? 😕



  • Naja, "geht nicht" ist keine Fehlerbeschreibung. 😡



  • naja das deutsche ö wird durch den String "\u0153" ersetzt und nicht durch das sich dahinter verbergende dänisch oe, laut unicode.



  • Ist dein CString überhaupt ein Unicode-String? Also ist er wchar_t-Parametresiert? Sieht nicht so aus. Sonst hättest du nämlich einen Compile-Error erhalten, bei den Literalen. Richtiger wäre es so:

    CString str;
    str = L"knäggebröt schmöckt nöcht";
    str.Replace(L'ö',L'\u0153');
    

    Wenn du denn dein Projekt auf Unicode eingestellt hast.

    Tip:
    http://msdn2.microsoft.com/en-us/library/ey142t48.aspx



  • Als Argumente kann ich TCHAR bei Replace eingeben!
    Ist das richtig oder falsch?
    Wenn ich das komplette Programm jetzt auf UNICODE umstelle sprich bei den Projekteinstellungen alles umändere, dann bekomm ich 300 Fehlermeldungen. Das ich überall bei den Strings _T mit einfügen kann weis ich ja, aber es kommen auch woanders Fehler die ich nicht interpretieren kann.

    Das muss doch auch irgendwie einfacher gehn das ich einfach nur dieses blöde dänische oe in den String einfügen kann anstatt normales ö.



  • TCHAR kann char oder wchar_t sein. Wie soll man da feststellen, obs richtig ist? 😉

    Tja, haste also doch kein Unicode-Projekt? Also, wenns auch einfacher gehen würde, würde niemand die Umstellung auf Unicode brauchen und alle wären Glücklich. Du willst in ASCII Unicode rein haben... ist irgendwie unlogisch.

    Was willst du denn mit den String machen? Willste den irgendwo ausgeben? (z.B. Bildschirm?) Wenn nicht, nimm einfach std::wstring.



  • Mein Gott, als ich das Projekt erstlelt hatte wusste kein Mensch das ich jemals dieses dämliche skandinavische oe brauchen werde, also wenn du oder ich mir jetzt Vorwürfe darüber machen komm ich auch nicht weiter.

    Also muss ich doch schon mal definitiv mein Programm auf _UNICODE umstellen. Das hab ich jetzt verstanden.

    Wie bekomme ich heraus ob es sich um char oder wchar_t handelt?



  • So, jetzt blick ich gar nicht mehr durch, habe das Projekt in Unicode geändert, bekomme aber u.a. diese Fehlermeldungen:

    float fpoti;
    char* Rest;
    CString poti;
    GetDlgItemText(IDC_EX16T_POTI,poti);   // String aus Eingabefeld
    fpoti = strtod(poti,&Rest);	       // hier kommt der Fehler
    

    error C2664: 'strtod' : Konvertierung des Parameters 1 von 'class CString' in 'const char *' nicht moeglich
    Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden

    jetzt kennt er strtod nicht mehr oder wie, warum, wieso, weshalb? ich könnt heulen... 😞

    Ein kleiner Tipp wär sehr nett!



  • strtod erfordert Ansi-Strings als Parameter, poti ist aber mittlerweile ein Unicode-String. Abhilfe: Unicode-Version von strtod verwenden.



  • Hab ich gefunden, ist wcstod(). Wusste ich nicht! Danke!

    Noch ein merkwürdiger Fehler:

    CString strFile;
    std::ifstream file(strFile);
    

    error C2664: '__thiscall std::basic_ifstream<char,struct std::char_traits<char> >::std::basic_ifstream<char,struct std::char_traits<char> >(const char *,int)' : Konvertierung des
    Parameters 1 von 'class CString' in 'const char *' nicht moeglich
    Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden



  • Die C++-FileStream-Konstruktoren können nur mit char-Strings umgehen.



  • Und wie lös ich das Problemchen? Da steh ich echt aufm Schlauch. 😕



  • Gibts zwei Möglichkeiten:

    1. Wandle deinen CString in dem Fall in einen ANSI-String um: http://msdn2.microsoft.com/en-us/library/ms235631.aspx
    2. Benutze boost-Filesystem, das hat die C++-Standard-Filestreams als Widechar-Varianten im Angebot.



  • OK, werde erste variante nehmen. Danke

    Habe noch eine Frage: Was ist der Unterschied zwischen _T("bla") und L ?



  • std::ifstream -> std::wifstream benutzen

    _T() wird je nach Projekteinstellung zu ASCII oder Unicode übersetzt
    L ist nur Unicode



  • EOP schrieb:

    std::ifstream -> std::wifstream benutzen

    Äh, nein. Der Elementtyp des Streams hat nichts mit dem Typ des Konstruktorparameters für den Dateinamen zu tun.


  • Mod

    std::string ist MBCS und CString ist vermutlich Unicode. Das kann nicht passen.

    Verstuch es doch grundsätzlich mit der TCHAR Notation.

    Dann könnest Du auch einen tsring definieren:
    typedef std::basic_string<TCHAR> tstring; ...


Anmelden zum Antworten