`mbstowcs()` Windows vs. Linux
-
Versuche es mal beim Aufruf anzugeben, s. Changing the Locale in WINE, anstatt mittels
setlocale
im Code:
LANG="de_CH.UTF8" wine main.exe
bzw.
LC_ALL="de_CH.UTF8" wine main.exe
(hier benutzt du die Linux-Nomenklatur, anstatt im Code die Windows-Runtime Nomenklatur)
-
entweder ist das eine eigenart von wine, mingw oder du machst was falsch...
Folgender code unter windows mit visual studio 2019 liefert non null zurück:
#include <stdio.h> #include <locale.h> int main(void) { printf("setlocale: %s\n", setlocale(LC_ALL, ".UTF8")); return 0; }
-
@Th69 sagte in `mbstowcs()` Windows vs. Linux:
Versuche es mal beim Aufruf anzugeben, s. Changing the Locale in WINE, anstatt mittels
setlocale
im Code:
LANG="de_CH.UTF8" wine main.exe
bzw.
LC_ALL="de_CH.UTF8" wine main.exe
(hier benutzt du die Linux-Nomenklatur, anstatt im Code die Windows-Runtime Nomenklatur)Nützt ihm aber nicht viel wenn er sein Programm unter einem richtigne windows laufen lassen möchte..
-
Das ist ja auch ersteinmal als Test gedacht, ob es mit Wine so funktioniert.
Ansonsten müßte er sein Programm unter einem echten Windows 10/11 (z.B. in einer VM) laufen lassen, da ".UTF8" erst dort eingeführt wurde:Ab Windows 10, Version 1803 (10.0.17134.0), unterstützt die universelle C-Runtime die Verwendung einer UTF-8-Codepage.
Und wenn ich die Doku richtig verstehe, so müßte man unter Windows den Bindestrich (statt Unterstrich) verwenden, z.B.
"de-CH.UTF8"
.
-
@firefly sagte in `mbstowcs()` Windows vs. Linux:
entweder ist das eine eigenart von wine, mingw oder du machst was falsch...
Folgender code unter windows mit visual studio 2019 liefert non null zurück:
#include <stdio.h> #include <locale.h> int main(void) { printf("setlocale: %s\n", setlocale(LC_ALL, ".UTF8")); return 0; }
Ich habe dies gerade in der VB mit Win10 probiert. Es kommt auch
(null)
Compiliert habe ich es mit wingw32x86_64-w64-mingw32-gcc main.cpp -o main.exe
Mit einem
(LC_ALL, "")
spuckt es in wine und VB-Win10 das gleiche aus:setlocale: German_Switzerland.1252
-
Es ist ein mingw problem.
https://stackoverflow.com/questions/73185769/build-a-program-with-mingw-on-linux-and-run-under-wine-utf-8-supportWEnn ich folgenden code unter windows mit visual studio (als mit dem microsoft compiler) im release build baue (unter Windows 10 22H2) und dann das binary unter linux mit wine starte funktioniert es:
#include <stdio.h> #include <locale.h> int main(void) { printf("setlocale: %s\n", setlocale(LC_ALL, ".utf8")); printf("%s\n", "\xc5\xb8\x41\xc3\x84\xc3\x96\xc3\x9c"); return 0; }
Output:
setlocale: English_United Kingdom.65001 ŸAÄÖÜ
Beachte die .65001 statt .1252 am ende der locale ausgabe.
65001 ist die codepage nummer für UTF-8
-
@firefly sagte in `mbstowcs()` Windows vs. Linux:
WEnn ich folgenden code unter windows mit visual studio (als mit dem microsoft compiler) im release build baue (unter Windows 10 22H2) und dann das binary unter linux mit wine starte funktioniert es:
Recht merkwürdig
setlocale
ist doch in dermsvcrt.dll
. Somit müssten doch beide Kompilate das gleiche Ergebnis liefern. Oder übersehe ich das etwas ?
-
@Mathuas sagte in `mbstowcs()` Windows vs. Linux:
@firefly sagte in `mbstowcs()` Windows vs. Linux:
WEnn ich folgenden code unter windows mit visual studio (als mit dem microsoft compiler) im release build baue (unter Windows 10 22H2) und dann das binary unter linux mit wine starte funktioniert es:
Recht merkwürdig
setlocale
ist doch in dermsvcrt.dll
. Somit müssten doch beide Kompilate das gleiche Ergebnis liefern. Oder übersehe ich das etwas ?Ja denn die "alte" C-Runtime (via msvcrt.dll) von Windows unterstützt kein UTF-8.
Sondern erst mit der "neuen" C-Runtime (UCRT) wird UTF-8 in der C-Runtime unterstützt.Wie man hier sehen kann
https://gist.github.com/minoki/c3d65d15982f17db0801e8a9b06333bf
(siehe die ausgaben wo versucht wird eine UTF-8 locale zu setzen.Oder auch hier beschrieben:
https://blog.r-project.org/2022/11/07/issues-while-switching-r-to-utf-8-and-ucrt-on-windows/https://stackoverflow.com/questions/67848972/differences-between-msvcrt-ucrt-and-vcruntime-libraries
Und deine mingw version nutzt die "alte" MS C-Runtime
-
@firefly sagte in `mbstowcs()` Windows vs. Linux:
Ja denn die "alte" C-Runtime (via msvcrt.dll) von Windows unterstützt kein UTF-8.
Sondern erst mit der "neuen" C-Runtime (UCRT) wird UTF-8 in der C-Runtime unterstützt.Wen ich es richtig verstehe, müsste man
ucrtbase.dll
einbinden ?
-
Kannst es ja mal mit dem DependencyWalker für die kompilierte Datei überprüfen.
Ansonsten habe ich für LLVM/Clang/LLD (anstatt gcc) unter github.com/mstorsjo/llvm-mingw UCRT-Support gefunden, d.h. Download der neuesten Version unter Releases.
-
@Th69 sagte in `mbstowcs()` Windows vs. Linux:
Kannst es ja mal mit dem DependencyWalker für die kompilierte Datei überprüfen.
Danke
Cooles Programm. Ich musste noch dieMFC42.dll
runterladen.Gibt es so etwas auch für Linux ?
-
Such doch einfach mal nach "Linux Dependency Walker"...
-
@Mathuas ldd
-
@Tyrdal
DankeIch habe gerade noch etwas genialeres entdeckt. Dies kommt fast an das von "Linux Dependency Walker" ran.
https://github.com/haampie/libtree
Es ist sogar bei Ubuntu dabei.
sudo apt install libtree
-
@Mathuas sagte in `mbstowcs()` Windows vs. Linux:
sudo apt install libtree
Danke auch für den Tip. Die Darstellung ist echt deutlich angenehmer zu lesen. Bei Debian ist es übrigens auch dabei.
-
@Finnegan sagte in `mbstowcs()` Windows vs. Linux:
Danke auch für den Tip. Die Darstellung ist echt deutlich angenehmer zu lesen. Bei Debian ist es übrigens auch dabei.
Mit diesen Parametern ist es recht ausführlich:
libtree /bin/ls -vvv -p
Einzig was mich stört. Die lila-Schrift ist kaum zu lesen.
-
@firefly sagte in `mbstowcs()` Windows vs. Linux:
@Th69 sagte in `mbstowcs()` Windows vs. Linux:
Versuche es mal beim Aufruf anzugeben, s. Changing the Locale in WINE, anstatt mittels
setlocale
im Code:
LANG="de_CH.UTF8" wine main.exe
bzw.
LC_ALL="de_CH.UTF8" wine main.exe
(hier benutzt du die Linux-Nomenklatur, anstatt im Code die Windows-Runtime Nomenklatur)Nützt ihm aber nicht viel wenn er sein Programm unter einem richtigen windows laufen lassen möchte.
Ich habe male ein wenig
LANG=
rumgespielt. Spannend was da rauskommt.#include <stdio.h> #include <locale.h> #include <time.h> int main(void) { time_t currtime; struct tm *timer; char buffer[80]; time( &currtime ); timer = localtime( &currtime ); printf("\nsetlocale: %s\n", setlocale(LC_ALL, "")); strftime(buffer,80,"%c", timer ); printf("Float: %f Date: %s\n\n", 123.456, buffer) ; return 0; }
Copilierscript:
echo echo ======== Linux ======== echo rm main gcc -o main main.c LANG="de_CH.UTF8" ./main LANG="de_DE.UTF8" ./main LANG="en_US.UTF8" ./main LANG="en_GB.UTF8" ./main echo echo ======== Windows ======== echo rm main.exe x86_64-w64-mingw32-gcc main.c -o main.exe LANG="de_CH.UTF8" wine main.exe LANG="de_DE.UTF8" wine main.exe LANG="en_US.UTF8" wine main.exe LANG="en_GB.UTF8" wine main.exe
Ausgabe:
======== Linux ======== setlocale: de_CH.UTF8 Float: 123.456000 Date: Mo 03 Jun 2024 17:31:02 setlocale: de_DE.UTF8 Float: 123,456000 Date: Mo 03 Jun 2024 17:31:02 CEST setlocale: en_US.UTF8 Float: 123.456000 Date: Mon 03 Jun 2024 05:31:02 PM CEST setlocale: en_GB.UTF8 Float: 123.456000 Date: Mon 03 Jun 2024 17:31:02 CEST ======== Windows ======== setlocale: German_Switzerland.1252 Float: 123.456000 Date: 3.6.2024 17:31:03 setlocale: German_Germany.1252 Float: 123,456000 Date: 3.6.2024 17:31:03 setlocale: English_United States.1252 Float: 123.456000 Date: 6/3/2024 5:31:03 PM setlocale: English_United Kingdom.1252 Float: 123.456000 Date: 03/06/2024 17:31:03
Es wird alles berücksichtigt, inklusive das unsympathische Komma beim Float für die Deutschen.
Was noch interessant ist, wieso kommt das Datum bei wine anders raus als unter Linux ?
-
@Mathuas sagte in `mbstowcs()` Windows vs. Linux:
Es wird alles berücksichtigt, inklusive das unsympathische Komma beim Float für die Deutschen.
Ist zwar OT, aber da ist schon was dran. Ich find den Punkt vor allem bei Auflistungen praktischer: "Die Werte sind 8.5, 3.4, 7.6 und 1.9".
-
@Finnegan sagte in `mbstowcs()` Windows vs. Linux:
Ist zwar OT, aber da ist schon was dran. Ich find den Punkt vor allem bei Auflistungen praktischer: "Die Werte sind 8.5, 3.4, 7.6 und 1.9".
Ich auch, ich weis nicht, wieso ihr Deutschen mir dem Komma rumschlägt ?
Dies kommt wohl aus der Office-Welt.
Das schlimmste ist sowas:
Schweiz: 1'000.00 €
Deutschland: 1.000,00 €Wen man da falsch liest, werden aus 1000€ auf einmal 100000€.
Und genau die Office-Welt hat diesen Mist eingeführt, die viel mit Geld rechnen.
-
@Mathuas sagte in `mbstowcs()` Windows vs. Linux:
Dies kommt wohl aus der Office-Welt.
Ne, mit Office hat das nichts zu tun, das ist historische Entwicklung aus einer Zeit lange bevor es Computer gab
Ich würde sogar behaupten, dass das Komma als Dezimaltrennzeichen weiter verbreitet ist. Der Dezimalpunkt kommt halt im Englischen vor, daher ist er in wissenschaftlicher Literatur weiter verbreitet.
Die Schweiz ist da ein (komischer) Sonderfall.