Unicode support



  • Hi!

    Ich möchte, dass mein Programm nicht nur Deutsch/Englisch sondern speziell auch Tschechisch/Französisch/Spanisch/Italienisch unterstützt (nachfolgend abgekürzt).
    Ich habe das noch nie gemacht und deshalb ein paar Fragen. Es gibt so viel Information zu Unicode... zu viel, um da mal einfach alles schnell kapiert zu haben.
    Soll man zB. UTF-16 meiden und intern std::string als UTF-8 verwenden, und nur bei WinAPI calls zu UTF-16 konvertieren? Das ist angeblich das beste Vorgehen. Was muss man da beachten? Gibt es eine gute Lib dafür? Oder WinAPI Funktionen?
    Und was ich mich noch frage: Wenn zB. einer mit CZE Codepage einen seiner speziellen Buchstaben speichert (zB von einem Editfeld), und einer mit FRE Codepage lädt den Text, kann es dann sein, dass er einen anderen Buchstaben sieht?
    Ich hab das noch immer nicht ganz kapiert... denn Codepages weisen doch bestimmten Zeichen bestimmte Bytes zu. Wenn jetzt die CZE Codepage ein A als 1 sieht (nur Beispiel) und die FRE Codepage die 1 aber als Z sieht... wie löst man das?

    Wäre für jeden Tipp dankbar.



  • Wenn die Anwendung nur unter Windows laufen muss, dann verwend einfach UTF-16 und fertig.

    Ansonsten:

    http://msdn.microsoft.com/en-us/library/windows/desktop/dd319072.aspx
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd374089.aspx

    Die Idee von Unicode ist ja gerade, dass man den ganzen Codepage Kram eben nicht braucht... 😉



  • Hi schrieb:

    Wenn jetzt die CZE Codepage ein A als 1 sieht (nur Beispiel) und die FRE Codepage die 1 aber als Z sieht... wie löst man das?

    Gar nicht. Wenn dir die Kodierung einer vorliegenden Bytefolge nicht bekannt ist, bist du nicht in der Lage eindeutig zu bestimmen, welches Zeichen damit dargestellt werden soll. Natürlich kann man je nach Kontext ein etwas besseres Rumraten veranstalten, aber mit sowas würde ich gar nicht erst anfangen, wenn du es nicht wirklich musst.

    Ansonsten kann ich ebenfalls nur auf die Vorzüge von UTF-8 hinweisen und dir die Verwendung empfehlen. Spezielle Ratschläge oder eine Library zum Umgang mit der WinAPI habe ich leider nicht.

    Ich selbst benutze gerne die libutf aus Plan 9 bzw. deren Unix-Port. Das ist eine kleine, sehr schön simple, C-Library mit hilfreichen Funktionen zum Handling von UTF-8 und Unicode generell. Für viele Aufgaben kann man UTF8-Text aufgrund seiner Eigenschaften auch genauso behandeln wie ASCII.

    Zum Konvertieren zwischen verschiedenen Unicode-Kodierungen und mehr ist iconv gängig. Gut möglich, dass es da auch irgendwas windows-spezifisches mit besserer Windwos-Integration gibt.



  • Aha, so wie ich das auf http://msdn.microsoft.com/en-us/library/windows/desktop/dd317720.aspx verstehe, sorgt Windows dafür, dass zB. WM_CHAR eben als UTF-16 ankommt, um Codepages brauche ich mir also keine Gedanken machen. Praktisch 😃

    Ja soll nur für Window sein. Also doch bei UTF-16 bleiben und wchar_t nutzen?

    Danke für die Tips, kennt jemand diese Lib http://site.icu-project.org/ und kann sie empfehlen?

    Achja, ich würde zB. gerne alle Unicode-Zeichen verbieten, die nichts mit den Sprachen zu tun haben, die ich unterstützen möchte. Damit möchte ich verhindern, dass irgendwelche speziellen Zeichen verwendet werden, die am Ende noch den Text seltsamst formatieren und komische Effekte haben (Sieht man immer wieder, zB Trillian Messenger, da hat sich einer nen Namen gegeben, dessen Buchstaben irgendwie u.A. vertikal nach unten gingen und andere Namen überdeckten...).
    Sowas mach ich dann am besten mit einer Lib und entsprechenden Checks, oder?



  • Hi schrieb:

    Achja, ich würde zB. gerne alle Unicode-Zeichen verbieten, die nichts mit den Sprachen zu tun haben, die ich unterstützen möchte.

    Das halt ich für eine äußerst schlechte Idee. Verwend einfach std::basic_string<WCHAR> und fertig...



  • Warum? Hat ja nen wichtigen Zweck, nämlich dass man keine Textformatierungen aller Art vornehmen kann, und das ist für das Programm auch gar nicht nötig.
    Andererseits kann ich mit dieser DrawString Funktion http://msdn.microsoft.com/en-us/library/windows/desktop/ms535991(v=vs.85).aspx ein bounding rect bestimmen, das sollte dann eigentlich ausreichen.. hmm.



  • Unicode kann keine "Formatierungen vornehmen". Was du da oben ansprichst, spielt wohl auf gewisse Steuerzeichen an, die die Leseflussrichtung ändern. Um Sprachen wie Chinesisch oder Arabisch zu supporten, insbesondere um Text in verschiedenen Sprachen mischen zu können, sind diese notwendig. Dich auf ein Subset von Unicode zu beschränken, würde den ganzen Sinn von Unicode untergraben. Dann kannst du gleich wieder zurück zu Codepages gehen, denn Unicode existiert eben gerade, um sämtliche Sprachen die der Mensch sich so ausgedacht hat unter einen Hut zu bringen...



  • Das mein ich ja damit...Steuerzeichen halt.

    Warum siehst du das so beschränkt? Ich hab doch gesagt, dass mein Programm nur gewisse Sprachen unterstützen muss, und mehr auch nicht.
    Mein Programm braucht nicht "sämtliche Sprachen die der Mensch...", nie nicht nimmer.

    Gibts denn nen einfachen Weg, diese Steuerzeichen zu unterbinden? Ich denke ein bounding rect wird reichen, interessiert mich jetzt aber trotzdem.



  • Naja, dann musst du eben einfach sicherstellen, dass derartige Zeichen bei der Eingabe ingoriert werden. Was du da mit einem Bounding Rect erreichen willst ist mir jedenfalls ein Rätsel und ich halte das Vorhaben für völlig sinnlos und eine schlechte Idee und kann nur stark davon abraten...

    Oder kannst du mir erklären, wieso man ein simples System unnötig verkomplizieren sollte, nur um dem Benutzer durch künstliche Einschränkungen anderes als das gewohnte Verhalten zu präsentieren!?

    Du hast gesagt, dass dein Programm nur gewisse Sprachen unterstützen muss, nicht dass das Programm jetzt und in alle Ewigkeit um jeden Preis nur gewisse Sprachen unterstützen darf. Bedenke, dass z.B. ein fanzösischer Benutzer irgendwann vielleicht mal gern irgendwo aus irgendeinem Grund ein Stück japanischen Text einfügen möchte. Wieso sollte man zusätzlichen Aufwand betreiben, um ihm das explizit zu verbieten, obwohl die Software es rein technisch gesehen einfach so unterstützen würde, ohne dass du irgendwas dafür tun musst?



  • Ja stimmt wohl, werde es eh sein lassen. Eigentlich ging es mir um diese Steuerzeichen, die den Text dann irgendwie exotisch aussehen lassen, was weiß ich, vertikal, vergrößert etc, alles schon gesehen. Und da kann doch ein bounding rect helfen, so dass der Text keinesfalls außerhalb einer Chattext-Zeile gezeichnet wird und zB. anderen Text verdeckt oder die Formatierung stört. Aber genau weiß ich auch nicht, wie das ist...


Anmelden zum Antworten