std::string.length() Umlaute werden doppelt gezählt



  • Hi,

    kurz ein paar Worte zum Projekt:
    Ich bin Backendentwickler und sitze an einem C++ Server (mit Boost). Die zu verarbeitenden Daten kommen meist von einem FlashClient per http request.
    Zum Testen laufen beide Applikationen über die Shell.

    Der Fehler tritt in beiden Ausführungen auf.

    Zum Fehler:
    Ich bekomme einen String und möchte von dem die Länge bestimmten. Dafur gibt es ja etliche Möglichkeiten (size, length, distance...)
    Allerdings werden ä,ö,ü und $ doppelt gezählt.
    -> "äää" ergibt bei mir also size 6.
    -> "äät" ergibt size 5.

    mit ascii-Chars an der Stelle zu arbeiten ist nur schwerlich möglich, da ich dem User ja schlecht sagen kann, daß er char(142) zb eingeben soll ^^

    Ich habe gestern schon Google gewälzt und Kollegen gefragt, aber keine Lösung gefunden. Also wende ich mich an euch.

    Habt ihr eine Idee woran das liegen kann?
    Umlaute und Sonderzeichen zu verbieten wird schwer, da das Projekt in sehr vielen Ländern eingesetzt wird und auch polnische, russische oder französische sonderzeichen vorkommen.

    Konnte es bisher auch nur mit deutschen Sonderzeichen (und $) testen, weiß daher nicht, ob das auch bei anderen länderspezifischen Zeichen auftritt.

    Gruß,
    Elayne



  • std::string kennt keine Kodierungen. Wenn Du ein ü UTF-8-kodiert als char-Sequenz in einem std::string speicherst, dann ist das eben mehr als nur ein Byte. Das ü hat im Unicode den Codepoint U+00DF und die UTF-8-Kodierung davon sieht so aus: C3 BC (hex), also zwei 8-Bit-Bytes (wenn ich mich nicht vertan habe).



  • mist, genau das hatte ich befürchtet.

    wie speichere ich das wort dann am besten?
    (Ich komme aus der Scriptecke und PHP ist das herzlich egal, was da für Sonderzeichen vorkommen)



  • Mit std::wstring kannst zu Zeichen verarbeiten, die 2 Byte groß sind. Wenns noch größere Zeichenkodierungen werden sollen, kannst du char32_t aus C++11 verwenden.



  • Alles klar, vielen Dank für die schnelle Hilfe! 🙂



  • Du kannst ja mal nach String-Bibliotheken für C++ suchen, die einfach zu nutzen und Unicode/UTF-8/UTF-16-aware sind. Ein schnelles Googeln hat mich hier hin geführt: http://utfcpp.sourceforge.net/ Das sieht zumindest vielversprechend aus. Diese Bibliothek kommt ohne eigene Stringklasse aus. Sie bietet generische Konvertierungsfunktionen und Iterator-Adapter an. Toll!

    So lange es nur Zeichen sind, die zB in ISO 8859-1 enthalten sind, reichen 8 Bits ja aus und man könnte die UTF-8 Sequenz zur Verarbeitung mit std::string nach ISO-8859-1 konvertieren.

    Wenn Du Dich auf die BMP (basic multilingual plane) von Unicode beschränken kannst, dann reichen 16 Bits pro Zeichen. Leider ist die Breite und die Bedeutung von wchar_t implementierungsspezifisch. Unter Windows sind das 16 Bit (für UTF-16) und unter Linux 32 Bit (für UTF-32).



  • krümelkacker schrieb:

    Leider ist die Breite und die Bedeutung von wchar_t implementierungsspezifisch. Unter Windows sind das 16 Bit (für UTF-16) und unter Linux 32 Bit (für UTF-32).

    Kleiner Zusatz: In C++11 gibt es auch den Typen char16_t, ich glaube es gibt auch sogar ein typedef für einen string-Typ.



  • Stimmt, das klingt wirklich gut!

    Allerdings darf ich keine neuen Libs verwenden (habe das gerade abgeklärt), da dann alles auf über 100 Servern (nach-)installiert werden müßte. Schade!

    Ich werd mir jetzt noch mal genauer diese wstring und char32_t Geschichte ansehen, ansonsten mri selbst was zusammen frickeln!

    Danke



  • Elayne schrieb:

    Allerdings darf ich keine neuen Libs verwenden (habe das gerade abgeklärt), da dann alles auf über 100 Servern (nach-)installiert werden müßte. Schade!

    Ich werd mir jetzt noch mal genauer diese wstring und char32_t Geschichte ansehen, ansonsten mri selbst was zusammen frickeln!

    Wenn du UTF-8 kodierte Zeichenketten bekommst, hilft dir ein wstring ohne entsprechende Konvertierungsfunktion recht wenig. Ob es Sinn macht, die selber zu implementieren?


  • Mod

    Elayne schrieb:

    Allerdings darf ich keine neuen Libs verwenden (habe das gerade abgeklärt), da dann alles auf über 100 Servern (nach-)installiert werden müßte. Schade!

    Schon mal was von statischem Linken gehört?



  • Im Falle von UTF8-CPP handelt es sich um eine Header-Only-Bibliothek. Sie besteht nur als 4 Header-Dateien. Die Lizenz ist sehr liberal. Du kannst also einfach die Header-Dateien bei Dir in das Projekt einbauen und fertig ist die Sache.



  • SeppJ schrieb:

    Schon mal was von statischem Linken gehört?

    Nein. Danke für den dummen Kommentar.

    krümelkacker schrieb:

    Im Falle von UTF8-CPP handelt es sich um eine Header-Only-Bibliothek. Sie besteht nur als 4 Header-Dateien. Die Lizenz ist sehr liberal. Du kannst also einfach die Header-Dateien bei Dir in das Projekt einbauen und fertig ist die Sache.

    Hab ich dann auch entdeckt, als ich mir das File mal interessehalber gezogen habe 😃
    Ist sehr einfach einzubauen und noch viel leichter zu bedienen! Läuft super, Chef und ich sind glücklich 🙂

    Danke für die Hilfe!


  • Mod

    Elayne schrieb:

    Nein. Danke für den dummen Kommentar.

    Dumm ist nur, wenn man solche Kommentare nicht versteht.



  • Nein, dumm ist es zu überlesen, daß ich eigentlich Skripter bin und keinerlei Ahnung von C++ mitbringe. Und es tut mir förmlich leid, daß ich innerhalb von 3 Wochen mir noch nicht das komplette Background-Wissen angeeignet habe.

    Nett wäre es gewesen, wenn du einen Link dazu geposted hättest oder "Schau dir mal statisches Linken an" geschrieben hättest.

    Und genau wegen solcher Leute und Kommentare meide ich solche Foren eigentlich.



  • Jo, der Umgangston ist nicht der Feinste. Aber wieso störst Du Dich daran? Du willst doch in erster Linie Hilfe und nicht jemanden, der Deine Eier schaukelt. Nimm doch einfach das Beste aus der Sache mit. Z.B. kannst Du aus SeppJs Frage ableiten, dass "statisches Linken" im Zusammenhang mit den vielen Änderungen im Unternehmen eine Lösung sein könnte. Das Schlagwort hast Du. Jetzt könntest Du danach googlen.

    Dass Du erwartest, direkt einen Link und alles zu bekommen, ist etwas zuviel. Ob Anfänger oder nicht; für weitere Infos danach zu googlen sollte ein angemessener Eigenaufwand sein, findest Du nicht?


  • Mod

    😕 Ich glaube da habe ich dich missverstanden. Ich dachte du meintest, dass ich dir nicht so dumme Anfängertipps geben sollte und darüber aufgebracht warst, dass ich es wage, dir so einen simplen Tipp wie statisches Linken zu geben. Denk dran, ich kann deinen Tonfall beim Lesen nicht hören.

    Weiterhin war ich davon ausgegangen, dass du im Zweifelsfalle Google bemühen kannst. Statisches Linken ist ein starkes Stichwort. Kurz gesagt: Sofern deine Bibliotheken nicht tief ins System eingreifen sondern deinem Programm einfach nur Funktionalität zur Verfügung stellen, musst du die Bibliotheken nicht auf 100 Rechnern installieren, sondern bloß auf dem Entwicklungsrechner und baust sie dann fest ins Programm ein.

    edit: Was ist in letzter Zeit bloß los, dass ich mit meinen Antworten immer so viel langsamer bin als andere



  • SeppJ schrieb:

    edit: Was ist in letzter Zeit bloß los, dass ich mit meinen Antworten immer so viel langsamer bin als andere

    Alter?



  • Ich glaube, unsere Antworten ergänzen sich in den nicht-redundanten Teilen ganz gut. 🙂


Anmelden zum Antworten