string und wstring ineinander umwandeln



  • Im Übrigen... macht ctype überhaupt was man erwartet - also Konvertierung von UNICODE runter auf ne Codepage (die jetzt nicht gerade Latin-1 ist)? Sollte man dafür nicht codecvt nehmen? Oder wctomb/mbtowc bzw. wcstombs/mbstowcs?



  • NES-Spieler schrieb:

    ...Ja, klar, wenn man das in möglichst wenig Zeit machen soll, sieht es auch wieder anders aus. Wobei das bei mir ja eigentlich nur vorkommen kann, wenn ich etwas in der Firma schreibe. Und da sieht die Sache sowieso wieder etwas anders aus: Da das dann nicht wirklich "mein" Programm ist, sondern das der Firma, hätte ich da auch weniger Probleme, mal irgendwas anderes einzubinden, wenn mein Auftraggeber das gutheißt. Hier habe ich allerdings von privaten Programmen gesprochen, die ich so erstelle. ...

    Wir sind uns also einig - wie schön. 🙂
    Bei mir ist es noch so, dass ich gerne auch erstmal das Konzept fremder Software begreife - die STL und boost (überhaupt viele template-Sachen) lösen oftmals Probleme mit einer ganz anderen Herangehensweise (so <functional>-Zeug z.B.) als mir das so eingefallen wäre. Bisweilen ist die Implementation dann gar nicht mehr so spannend wie die Schnittstelle (für mich). Da lerne ich dann viel über Programmierung - obwohl ich das Zeug "nur" verwende....und in dem Zusammenhang ist für mich in Davids Code auch was dabei. "Kompliziert" ist das Ganze dann höchsten, weil es Sprachelemente und -denkweisen verwendet, in denen ich weniger geübt bin (als in for-Schleifen und if-Abfragen) - aber wenn ich ehrlich bin, muss ich zugeben, dass "meine Lösung" nicht kürzer und definitiv nicht eleganter geworden wäre.

    Schönen Tag noch,

    Simon2.



  • 1. Ich halte es für einen Anfänger auch dann noch für schwierig selbst Dinge wie Tetris zu proggen. Dazu gehört schon ein bisschen mehr, als nur Bibliotheken zu linken. Zumindest ist das bei mir so.

    Was Anfänger machen, ist mir egal. Aber ich selbst möchte mein Spiel nicht in der Weise beschreiben müssen, wie ich es oben beispielhaft getan habe.

    Ich frage mich, nach welchen Kriterien du auswählst, was du benutzt und was nicht.

    Also: Richtig ordentlich aufgebaute und umfangreiche professionelle Frameworks sind o.k. Es ist meiner Meinung nach kein Problem, zu sagen: "Ich habe für mein Programm Boost und OpenGL benutzt." Aber wenn es nur ein Codeschnipsel einer einzigen kleinen Funktion ist, habe ich sehr wohl ein Problem damit, zu sagen: "Ich habe für mein Programm eine Funktion von so einer Person aus dem C++-Forum, eine Funktion der WinAPI-Seite, eine kleine Klasse von irgendeiner privaten Homepage, einen Teil des Quellcodes von einem Projekt eines Bekannten und ein Stückchen Code genommen, den man mir per E-Mail zugeschickt hat."

    Und zweitens frage ich mich, ob du verstanden hast, warum man Header und Sourcedateien überhaupt verwendet. Eben um nur die Scnittstelle und nicht den ganzen Hokuspokus dahinter zu kennen. Ich sage nicht, dass das immer unwichtig ist, aber warum alles 100% verstehen wollen, wenn es auch so klappt.

    Weil das bei so richtigen Frameworks vielleicht ganz gut ist. Aber nicht, wenn da ein kleiner Code ist, der genau für eine einzige spezielle Aufgabe zuständig ist. Bei sowas mach ich mir eben durchaus die Mühe, es zu verstehen. (Oder auch nicht, aber dann verwende ich es auch nicht.) Wie es andere machen, ist mir egal. Sie sollen sich das ganze mit Copy & Paste von mir aus zusammenfriemeln, wie sie wollen. Aber wenn ich einzelne Algorithmen bei mir aufnehme (ich rede nicht von Komplettframeworks), dann nur, wenn ich sie verstanden und selber (mit meinen Variablennamen, meiner Einrückungsweise etc.) nachprogrammiert habe.

    Wie machst du das im Alltag. Kaufst du dir einen CD-Player oder baust du selber einen?

    Der CD-Player entspricht in diesem Vergleich ja auch dem kompletten Framework und nicht dem Codeschnipsel. Aber um den Vergleich mal etwas abgewandelt zu präsentieren: Klar, wenn ich vorhätte, einen CD-Player selbst zu bauen, dann würde ich ihn mit den Einzelteilen auch von Grund auf zusammenbauen. Und wenn ich nach 75% Fertigstellung nicht weiterkomme, dann guck ich mir einen bereits fertigen CD-Player zwar an, um zu sehen, wie man die restlichen 25% nun zusammenbastelt, aber ich würde nicht diese 25% von einem fremden Player abschrauben und auf meinen raufsetzen. Wie sieht denn das aus? 75% selbst gebaut und 25% 1:1 von einem anderen CD-Player übernommen. Genauso rottig sieht es aus, wenn ich zwar 99% meines Quellcodes selber (oder eben mit professionellen Frameworks) mache, aber 1% aus beliebig zusammengeschustertem Fremdcode besteht. Dann kann ich mir für diesen Code auch nochmal die Mühe machen, ihn mir anzusehen und neu zu schreiben.

    Nun frage ich dich: hast du das auch vor zu implementieren??? Das wirst du nämlich müssen, wenn du alles selber verstehen willst. Wo ist die Grenze???

    Ich habe nicht vor, alles selber zu machen. Besonders das nicht, was mir der Standard von C++ abnimmt. Das heißt, ich programmiere keine eigene String-Klasse oder sowas.

    Und wenn du Grafikprogrammierung machst, weißt du auch wie man einen 3D-Chip programmiert? Sach schon??? Warum benutzt du OpenGL??? Wenn du OpenGL benutz, hast du noch lange nicht die Implementierung von OpenGL und die eines Grafikchips verstanden. Du benutzt dann praktisch auch nur das, was wir die hier gepostet haben: ein string2wstring.h!!!

    Wenn string2wstring.h Teil eines großen, professionellen Frameworks wäre, das ich benutze, würde ich es auch nehmen. (So wie ich jetzt wohl die entsprechend WinAPI-Funktion dafür nehme.) Wenn dagegen das gesamte OpenGL lediglich aus zwei Funktionen bestünde: Eine zum Laden eines Bildes aus einer Ressource und eine zum Laden eines Bilder aus einer Datei, dann würde ich es auch nicht verwenden, weil das bißchen kann ich dann auch noch selbst programmieren.

    Also nochmal zusammengefaßt: Ein professionelles Framework benutzen: Ja. Denn nicht jeder kann diese komplexen Funktionen, die so ein Framework liefert, mal schnell nachprogrammieren. Aber: Einen Codeschnipsel von sonstwo, der nur für eine kleine Funktionalität gut ist, einfach so nehmen, ohne sich für die Implementierung zu interessieren: Nein. Da mach ich mir entweder die Mühe, den Sinn dahinter zu verstehen und es selbst nochmal zu programmieren, oder ich laß es sein, wenn ich's nicht kapiere. Wie gesagt: Zu sagen, ich benutze OpenGL, ist in Ordnung. Aber zu sagen: Ja, meine Codes sind von da, da und da zusammenkopiert, das klingt, wie Ihr es immer so gern nennt, nach Frickler.

    Und noch was: wenn dir jemand eine Lösung postet, die auch noch funktioniert, ist es das Letzte, ihn dumm anzumachen.

    Ja, o.k., die Frage, ob das sein Ernst ist, war nicht ganz passend. Ich dachte eben, das wäre etwas trivialer, da ja sowohl Unicode, als auch normale Strings Bestandteil von Standard-C++ sind.

    So sage ich aber nur eines: warum fragst du erst, wenn du es eh nicht selbst versucht hast? Warum hast du es nicht selbst versucht?

    Wie soll ich es selbst versuchen, wenn ich gar keinen Ansatz habe?

    string a="Hallo";
    wstring w=a;
    

    funktioniert nicht und

    string a="Hallo";
    wstring w (a.begin (), a.end ());
    

    ist Unsinn. Nachdem ich das ausprobiert hatte, wußte ich nicht mehr weiter. Daß es da irgendwelche locales etc. gibt, war mir ja gar nicht bewußt, also hätte ich auch nicht drauf kommen können. Wie gesagt, ich dachte es gibt irgendwo in der Standard-Bibliothek eine Funktion im Stil von convert_string, die ich bisher nur übersehen habe.



  • NES-Spieler schrieb:

    (...)Wie gesagt, ich dachte es gibt irgendwo in der Standard-Bibliothek eine Funktion im Stil von convert_string, die ich bisher nur übersehen habe.

    wcstombs/mbstowcs
    Und nu hör bitte endlich auf zu jammern, das hält ja echt keiner aus oh Mann oh Mann.



  • Hä? Wieso jammern? Es ging mir doch im letzten Beitrag gar nicht mehr darum, dafür noch irgendwelche Methoden zu erfragen. Daß ich das nochmal erwähnt hatte, diente lediglich dazu, meine Vorgehensweise zu erläutern, da mich Artchi dazu befragt hatte. Also habe ich auch nicht gejammert.



  • Hmmm...weiss nicht, ob ich das jetzt im Beitrag ueberlesen habe:

    string2wstring(const std::string& str) {
    std::wstringstream wsstr;
    	wsstr << str
    return wsstr.str();
    }
    

    Zum einfachen Umwandeln, voellig ausreichend.

    gruss
    v R



  • Bei mir sagt er, daß es keine Überladung des <<-Operators gibt, der einen std::string akzeptiert. Was mir auch logisch ist, denn wenn der =-Operator von wstring keinen string entgegennehmen kann, wieso sollte es dann der <<-Operator von wstringstream tun? Ich weiß aber nicht, ob der Fehler nur kommt, weil ich VC++6 nehme. MinGW kann das ganze wstring-Zeug nicht. Wie sieht es bei VC++2005 aus?


  • Mod

    virtuell Realisticer schrieb:

    Hmmm...weiss nicht, ob ich das jetzt im Beitrag ueberlesen habe:

    string2wstring(const std::string& str) {
    std::wstringstream wsstr;
    	wsstr << str
    return wsstr.str();
    }
    

    Zum einfachen Umwandeln, voellig ausreichend.

    gruss
    v R

    Wäre so, wenn es erlaubt wäre. Leider gibt es einen solchen Inserter für wostream und string nicht.


Anmelden zum Antworten