Umlaute in AfxMessageBox



  • Hallo,

    ich habe ein Projekt, welches ich unter Visual Studio 2015 entwickelt hatte nach Visual Studio 2019 portiert. Jetzt musste ich feststellen, dass alle Umlaute in allen CStrings in den Messageboxen wie auch in der Statuszeile nicht richtig dargestellt werden. In den Dialogfeldern verwendete Static-Text-Elemente hingegen stellen alles richtig dar. In der Projekteinstellungen ist Unicode-Zeichensatz eingestellt. Wie kann ich das Problem beheben?



  • Poste bitte folgendes hier:

    • Einen AfxMessageBox Aufruf wo die Umlaute nicht funktionieren
    • Das Encoding deiner Source-Files (also mit welchem Encoding die Texte im Source File richtig angezeigt werden)
    • Alle Compiler Options (in den Projekteinstellungen unter "C++/Command Line")


  • @hustbaer sagte in Umlaute in AfxMessageBox:

    Poste bitte folgendes hier:

    • Einen AfxMessageBox Aufruf wo die Umlaute nicht funktionieren
    AfxMessageBox(_T("Diese Funktion wird von dieser Programmversion nicht unterstützt! Folgende Einstellungen sind hardwareseitig vorgenommen:\n1. Analog-Out-Subdevice (Subdevice 5): Sollwert Regler\n2. Analog-Out-Subdevice (Subdevice 6): Sollwert Bremse"), MB_OK | MB_ICONWARNING);
    
    
    • Das Encoding deiner Source-Files (also mit welchem Encoding die Texte im Source File richtig angezeigt werden)
    Was ist da genau gemeint? Das verstehe ich leider nicht.
    
    • Alle Compiler Options (in den Projekteinstellungen unter "C++/Command Line")
    /JMC /Yu"pch.h" /ifcOutput "x64\Debug\" /GS /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl /Fd"x64\Debug\vc142.pdb" /Zc:inline /fp:precise /D "_WINDOWS" /D "_DEBUG" /D "_UNICODE" /D "UNICODE" /D "_AFXDLL" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /FC /Fa"x64\Debug\" /EHsc /nologo /Fo"x64\Debug\" /Fp"x64\Debug\Wickel.pch" /diagnostics:column 
    

    Diese Einstellungen gelten für x64 Debug . Komisch ist, dass es unter Visual Studio 2015 funktionierte. Ich habe mir mal eine Funktion zum Konvertieren von UTF8 nach Unicode geschrieben:

    CStringW ConvertUTF8ToUnicode(const CStringA& utf8)
    {
    	if (utf8.IsEmpty()) return L""; // nothing to do
    	CStringW uni;
    	int cc = 0;
    	// get length (cc) of the new widechar excluding the \0 terminator first
    	if ((cc = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0) - 1) > 0)
    	{
    		// convert
    		wchar_t *buf = uni.GetBuffer(cc);
    		if (buf) MultiByteToWideChar(CP_UTF8, 0, utf8, -1, buf, cc);
    		uni.ReleaseBuffer();
    	}
    	return uni;
    }
    

    Wenn ich die Messagebox wie folgt aufrufe, funktioniert das komischerweise:

    AfxMessageBox(ConvertUTF8ToUnicode("Diese Funktion wird von dieser Programmversion nicht unterstützt! Folgende Einstellungen sind hardwareseitig vorgenommen:\n1. Analog-Out-Subdevice (Subdevice 5): Sollwert Regler\n2. Analog-Out-Subdevice (Subdevice 6): Sollwert Bremse"), MB_OK | MB_ICONWARNING);
    


  • Das heisst vermutlich dein Source-File ist UTF-8, aber VS 2019 interpretiert es wohl als ANSI (z.B. CP 1252).

    Gibt jetzt einige Möglichkeiten das zu fixen.

    • Du kannst deine Files als UTF-8 "mit BOM" speichern.
    • Du kannst unter " C/C++ > Command Line/Additional Options" /source-charset:utf-8 reinschreiben
    • Du kannst unter " C/C++ > Command Line/Additional Options" /utf-8 reinschreiben
    • Konvertier die Source-Files von UTF-8 nach Codepage 1252 zurück.

    Möglichkeit 1 und 2 sollten equivalent sein. Beide sollten dazu führen dass Strings in Source Files als UTF-8 interpretiert werden, aber String-Literals die in die .exe geschrieben werden weiterhin z.B. CP-1252 bleiben.

    Möglichkeit 3 stellt alles auf UTF-8 um, d.h. der Compiler interpretiert Strings in den Source Files als UTF-8, und speichert sie auch wieder aus UTF-8 in dein Programm. Wenn du 8-Bit strings in deinem Programm hast, dann wären die danach alle UTF-8 in der EXE.

    Möglichkeit 4 sollte klar sein: du lässt den Compiler weiterhin die Files als ANSI interpretieren, und änderst die Source Files so dass diese auch wirklich ANSI sind.

    Wenn du dein Programm zusätzlich auch noch mit MBCS/älteren Compilern übersetzen willst, würde ich auf jeden Fall (4) empfehlen.



  • Komisch ist, dass es unter Visual Studio 2015 funktionierte.

    Sind das die exakt gleichen Source-Files? Oder wurd da irgendwas konvertiert?



  • @hustbaer Ich habe das Projekt importiert. Damit wurde es angepasst. Jedoch wenn man ein neues frisches Projekt erstellt ist das eben auch so.
    Wenn ich jetzt /source-charset:utf-8 verwende funktioniert es, jedoch spuckt der Compiler folgende Warnung aus:
    D:\Visual Studio 2019\eigene\Header\Test.h(1,1): warning C4828: Die Datei enthält ein Zeichen, das bei Offset 0x322 beginnt. Dieses Zeichen ist im aktuellen Quellzeichensatz (Codepage 65001) unzulässig.



  • So, ich hab das Projekt neu erstellt und in die entsprechenden Files den Text hineinkopiert. Gleiches Problem wie vorher. Auch wenn man ein frisches Projekt erstellt und an einer x-beliebigen Stelle eine Messagebox mit Umlauten anzeigen lässt passiert das Problem. Die Ressourcenfiles scheinen anscheinend anders interpretiert zu werden. Im Ribbon wie auch in allen Static text Controls werden Umlaute richtig angezeigt.



  • @AndyDD sagte in Umlaute in AfxMessageBox:

    warning C4828: Die Datei enthält ein Zeichen, das bei Offset 0x322 beginnt. Dieses Zeichen ist im aktuellen Quellzeichensatz (Codepage 65001) unzulässig.

    Dann sind deine Source-Files eine Mischung aus UTF-8 und einem anderen Encoding. Das kann mMn. nicht funktionieren. Was steht denn an Offset 0x322?



  • @hustbaer Das hab ich jetzt auch herausgefunden. Einige sind UTF-8, enige ANSI. Der Assistent legt die anscheindend so wild an. Wenn ich die auf ANSI oder UTF-8 with BOM setze dann funktioniert es. An dem Offset war noch der Standard-Kommentar in der Header-Datei und da stand ein ü.


Anmelden zum Antworten