none
MBCS-Anwendung: Fehler bei LoadString() z.B. auf Koreanischem Windows RRS feed

  • Frage

  • Hallo,
    habe eine MBCS-Anwendung. (Kann diese auf die schnelle nicht umstellen auf Unicode)
    Unter z.B. einem koreanischem Windows werden Sonderzeichen z.B. ä,ö,ü falsch angezeigt.

    Habe folgendes Beispiel gefunden mit dem es scheinbar funktioniert:

    CString LoadResourceStr( DWORD ResourceID )
    {
    //* Resourcestrings wurden z.B. unter Koreanischem Windows bei ä,ö,ü falsch gelesen

    #ifdef LANGUAGE_GERMAN
    //* entspricht 407 im *.rc File
    if(1031 != GetThreadLocale())
    SetThreadLocale(1031);
    #else
    //* entspricht 409 im *.rc File
    if(1033 != GetThreadLocale())
    SetThreadLocale(1033);
    #endif
    CString csResourceStr(MAKEINTRESOURCE(ResourceID));
    return csResourceStr;
    }
    Welche Risiken habe ich, wenn ich SetThreadLocale() fest auf 1031 in meiner deutschen Version und 1033 in meiner engl. Version setze?
    Ich kann die Folgen leider nicht abschätzen.

    FB
    Mittwoch, 11. Mai 2011 13:45

Alle Antworten

  • Welche Risiken habe ich, wenn ich SetThreadLocale() fest auf 1031 in meiner deutschen Version und 1033 in meiner engl. Version setze?
    Ich kann die Folgen leider nicht abschätzen.

    Wenn ich die Doku lese, müsste es klappen. Die Funktionen auf die SetThreadLocale Einfluss hat sind ja nicht viele.

    Die Ressourcen werden in diesem Fall als Unicode geladen und mit dieser Code-Page umgewandelt.

    Der bessere Weg wäre in jedem Fall Unicode zu verwenden.
    Oder LoadStringW auszuführen und den Unicode String so umzuwandeln, wie Du es für korrekt hältst.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 12. Mai 2011 06:15
    Moderator
  • Das funktioniert unter Umständen nicht zuverlässig. Wenn GetThreadLocale() == GetUserDefaultLCID() wird als Locale Neutral, also 0, verwendet. Wenn da dann nichts gefunden wird, wird die erste verfügbare Locale genommen. Da 1031 nun mal vor 1033 kommt, wird die Ressource auf einem US-Englischen Rechner in deutsch geladen werden. Das ist auch der Grund für die Empfehlung der Doku "Do not use SetThreadLocale to select a user interface language. To select the resource that is defined in the .rc file with a LANGUAGE statement, the application must use the FindResourceEx function."

     

    Donnerstag, 12. Mai 2011 10:05