Großes C++ Projekt auf UTF-16 portieren



  • Das macht mir ja schonmal Mut 🙂

    Wie sieht denn das aus bei Dingen, wie:

    wstring foo = "abc";
    if(foo == "abc")
        bar();
    

    Muss ich dass dann auch alles mit _T bzw. L versehen? Oder merkt er das alleine?



  • Das macht mir ja schonmal Mut 🙂

    Win9x ist kein Problem - alle unsere Kunden haben, wie wir aus den Bestellungs-
    daten sehen können Win XP/2000. Die Software ist auch eher für IT Professionals.



  • L musst du natürlich davor schreiben, sonst ist es kein wchar_t*.



  • Oha... sind die Posts doch noch angekommen *g

    Bin den ganzen Tag an der Portierung gewesen. Nach einem simplen Replace von
    string durch wstring und dem setzen des Compiler-Flags gab es natürlich
    1000ende Fehler, weil alle möglichen Strings zu wchars gemacht werden mussten.
    Das ganze wird wohl noch ein paar Tage in Anspruch nehmen - besonders er-
    schwerend ist, dass wir noch eine Menge Bibliotheken (z.B. zum Datenbank-
    zugriff) nutzen, die noch nie was von Unicode gehört haben...

    Aber das Ergebnis wird es hoffentlich wieder gut machen 🙂 Freu mich schon
    auf unsere Werbe-Screenshots mit chinesischen Zeichen 🤡



  • Hi

    und nicht vergessen die Datenbank auf Unicode umstellen, sonst kommt da noch ne böse überaschung und ihr wundert euch wieso da nur ? oder so komische kästchen stehen.

    und noch viel spass beim portieren.

    Gruss Termite

    ps. Grichisch sieht auch schon ganz lustig aus 🙂 Aber ich möcht nicht wissen wie ein chinesisches XP aussieht. Das kann man dan sicher nur noch im blindflug bedienen. Dänisch und Spanisch war bei mir ja schon grauenhaft.



  • Optimizer schrieb:

    Du musst dir nur immer bewusst sein, dass das n-te wchar_t nicht zwangsläufig das n-te Zeichen ist.

    Hallo,

    bei einem aktuellen Projekt wollen wir die Hauptfunktionalitäten in C++ und die GUI in Java machen. C++ soll jedoch von Unicode nichts wissen und nur ASCII verarbeiten. Es ist jedoch so, dass C++ in ein Buffer in der Java-Schicht ASCII reinschreibt, die dann in Java in Unicode konvertiert werden. Der Buffer dient als Model für ein TextArea. Die "Offsets" der Zeichen müssen jedoch beibehalten werden, da z.B. die C++ Schicht dem Buffer sagen kann, dass das n-te Zeichen gelöscht werden soll.
    Kann ich sicher sein, dass das n-te java-char im Buffer auch das n-te ASCII-Zeichen ist?

    danke!

    Gruß mathik



  • Ich bin jetzt nicht wirklich sicher, wie das zu verstehen ist. Hast du aus Java-Sicht ein char[] oder ein byte[]? Sagt das C++ Programm, dass der Java-Teil etwas konvertiert in den Buffer schreiben soll, oder schreibt der C++ Teil selber direkt ASCII-Text rein? Vielleicht kannst du das nochmal genauer erklären.

    Kann ich sicher sein, dass das n-te java-char im Buffer auch das n-te ASCII-Zeichen ist?

    Also ist es ein char[]? Ein Unicode-Zeichen kann in Java auch aus 2 chars bestehen, wie bei UTF-16 üblich. Deshalb hat ein Java-String Methoden, um das n-te Zeichen zu suchen. Wenn du also ein char[] hast, hast du wieder keinen problemlosen random access, es empfiehlt sich daher einen String zu benutzen. Wahrscheinlich ist die beste Vorgehensweise die:

    - byte[] von C++ Programmteil geben lassen
    - String daraus konstruieren



  • Optimizer schrieb:

    Ich bin jetzt nicht wirklich sicher, wie das zu verstehen ist. Hast du aus Java-Sicht ein char[] oder ein byte[]? Sagt das C++ Programm, dass der Java-Teil etwas konvertiert in den Buffer schreiben soll, oder schreibt der C++ Teil selber direkt ASCII-Text rein? Vielleicht kannst du das nochmal genauer erklären.

    Kann ich sicher sein, dass das n-te java-char im Buffer auch das n-te ASCII-Zeichen ist?

    Also ist es ein char[]? Ein Unicode-Zeichen kann in Java auch aus 2 chars bestehen, wie bei UTF-16 üblich. Deshalb hat ein Java-String Methoden, um das n-te Zeichen zu suchen. Wenn du also ein char[] hast, hast du wieder keinen problemlosen random access, es empfiehlt sich daher einen String zu benutzen. Wahrscheinlich ist die beste Vorgehensweise die:

    - byte[] von C++ Programmteil geben lassen
    - String daraus konstruieren

    in JNI wird folgendes gemacht:

    char* ascii = "Nur ASCII zeichen hier";
    jstring str = (*env)->NewStringUTF(env, ascii);
    str an eine Java-Fkt übergeben.

    ist jetzt immer garantiert, dass str die gleiche Länge hat wie ascii und dass der Offset der Zeichen übereinstimmt?

    Gruß mathik



  • Die Länge in Zeichen müssten sowieso gleich sein, sonst wäre es kein gleichwertiger String. Die indizes der Zeichen ... müssten eigentlich auch gleich sein, da es sich ja um ASCII-Zeichen handelt und ich deshalb nicht annehme, dass ein Zeichen mit 2 chars kodiert wird. Ich sehe jetzt kein Problem.
    Die binäre 0 am Ende des C-Strings wirst du ja kaum mitzählen.



  • Optimizer schrieb:

    Die Länge in Zeichen müssten sowieso gleich sein, sonst wäre es kein gleichwertiger String. Die indizes der Zeichen ... müssten eigentlich auch gleich sein, da es sich ja um ASCII-Zeichen handelt und ich deshalb nicht annehme, dass ein Zeichen mit 2 chars kodiert wird. Ich sehe jetzt kein Problem.
    Die binäre 0 am Ende des C-Strings wirst du ja kaum mitzählen.

    ok, danke!

    Gruß mathik


Anmelden zum Antworten