Unicode Problem



  • #include <windows.h>
    #include <tchar.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
        int cxscreen = GetSystemMetrics(SM_CXSCREEN);
        int cyscreen = GetSystemMetrics(SM_CYSCREEN);
    
        TCHAR szBuffer[36];
        _sntprintf(szBuffer, 36, TEXT("Höhe: %d Pixel\nBreite: %d Pixel\0"), cxscreen, cyscreen);
        MessageBox(NULL, szBuffer, TEXT("Auflösung"), 0);
        return 0;
    }
    

    Das Programm läuft einwandfrei, aber ich habe folgendes Problem:

    Sobald ich die Zeile "#define UNICODE" hinzufüge, sind die Strings in der Messagebox alles japanische Zeichen.



  • . . . schrieb:

    Sobald ich die Zeile "#define UNICODE" hinzufüge, sind die Strings in der Messagebox alles japanische Zeichen.

    Nicht nur UNICODE definieren (wegen WinAPI), sondern zusätzlich auch _UNICODE (wegen CRT). Dann sollte es gehen.

    Übrigens: Du benutzt die falsche Main-Funktion. Wenn Du für UNICODE compilierst, muss es wWinMain heißen. Auch musst Du den dritten Parameter auf PWSTR ändern. Oder aber so, dass es sowohl als auch funktioniert:

    int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PTSTR szCmdLine, int iCmdShow)
    


  • Nö, nur, wenn er eine unicode command line verarbeiten will.



  • Wenn er die Unicode-define ergänzt zwickt es hier:

    _sntprintf(szBuffer, 36, TEXT("Höhe: %d Pixel\nBreite: %d Pixel\0"), cxscreen, cyscreen);
    


  • break; schrieb:

    Nö, nur, wenn er eine unicode command line verarbeiten will.

    Bei mir auch dann, wenn ich gar keine Command Line verarbeiten will. Ich bekomme sonst nämlich ein "unresolved external" vom Linker um die Ohren.



  • Dann suXXt dein compil0r



  • f.-th. schrieb:

    Wenn er die Unicode-define ergänzt zwickt es hier:

    _sntprintf(szBuffer, 36, TEXT("Höhe: %d Pixel\nBreite: %d Pixel\0"), cxscreen, cyscreen);
    

    Richtig.

    #define UNICODE
    #define _UNICODE
    
    #include <windows.h>
    #include <tchar.h>
    
    int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PTSTR szCmdLine, int iCmdShow)
    {
        int cxscreen = GetSystemMetrics(SM_CXSCREEN);
        int cyscreen = GetSystemMetrics(SM_CYSCREEN);
    
        TCHAR szBuffer[36];
        _sntprintf(szBuffer, 36, TEXT("Höhe: %d Pixel\nBreite: %d Pixel\0"), cxscreen, cyscreen);
        MessageBox(NULL, szBuffer, TEXT("Auflösung"), 0);
        return 0;
    }
    

    converting to execution character set: Illegal byte sequence

    Ich komme allerdings nicht dahinter woran es liegt.



  • Illegal byte sequence = "ö"



  • Der folgende Quellcode ist compilerabhängig:

    #define UNICODE
    
    #include <windows.h>
    #include <tchar.h>
    #include <locale.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
        int cxscreen = GetSystemMetrics(SM_CXSCREEN);
        int cyscreen = GetSystemMetrics(SM_CYSCREEN);
    
        setlocale(LC_CTYPE, "DE");
        TCHAR szBuffer[36];
        _sntprintf(szBuffer, 36, TEXT("Höhe: %d Pixel\nBreite: %d Pixel\0"), cxscreen, cyscreen);
        MessageBox(NULL, szBuffer, TEXT("Auflösung"), MB_OK);
    
        return 0;
    }
    

    Den gcc 4.4.1 kann ich nicht davon überzeugen das das geht.

    Der Digital Mars 8.52 compiliert, gibt aber nach dem H von Höhe aus der Zeile nichts sichtbares aus -> "Auflösung" stellt er aber richtig dar!



  • Soviel beim gcc probiert 😕

    Der Digital macht alles wie er soll, wenn es so beginnt:

    #define UNICODE
    #define _UNICODE // fehlte im Code!
    


  • Unicode sollte doch das Zeichen 'ö' unterstützen?



  • Macht es doch bei meinem Quelltext, wenn du die beiden vorherigen Beiträge zusammenfügst und den passenden Compiler wählst. Das "ö" und die anderen werden dann ausgegeben. Der Digital Mars 8.52 kann es jedenfalls.

    Warum die Compiler bei den ersten Beiträge die "exotischen" Zeichen ausgeben weiss ich nicht. Meine Vermutung war das der Zeichensatz des OS oder ein englischsprachiger bevorzugt wird, aber das ist ja scheinbar anders.



  • So Nachtrag:
    Der Digital-Mars 8.52 mit dem Schalter -Ae unter Code::Blocks 10.5 ohne Zeichensatzänderungen kann den Quelltext so übersetzen.

    Bei gcc 4.4.1 unter Code::Blocks muss der Code unter:
    Code::Blocks 10.5 & gcc 4.4.1 => edit -> fileencoding: UTF-8 einstellen
    und speichern und dann compilieren 👍

    extra -> die "Speicher-Automatic" bei compilieren funktioniert nicht bei Zeichensatzänderungen

    Viel Spass
    f.-th.


Log in to reply